From 975f66f2eebe9dadba04f275774d4ab83f74cf25 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 14:04:41 +0200 Subject: Adding upstream version 7.7.0+dfsg. Signed-off-by: Daniel Baumann --- .../arista/eos/.github/workflows/tests.yml | 45 + ansible_collections/arista/eos/.gitignore | 104 + ansible_collections/arista/eos/.isort.cfg | 6 + .../arista/eos/.pre-commit-config.yaml | 58 + ansible_collections/arista/eos/.prettierignore | 23 + ansible_collections/arista/eos/.yamllint | 15 + ansible_collections/arista/eos/CHANGELOG.rst | 403 + ansible_collections/arista/eos/FILES.json | 9511 ++++++++++++++++++++ ansible_collections/arista/eos/LICENSE | 674 ++ ansible_collections/arista/eos/MANIFEST.json | 35 + ansible_collections/arista/eos/README.md | 160 + ansible_collections/arista/eos/bindep.txt | 9 + .../arista/eos/changelogs/changelog.yaml | 509 ++ .../arista/eos/changelogs/config.yaml | 30 + .../arista/eos/changelogs/fragments/.keep | 0 .../docs/arista.eos.eos_acl_interfaces_module.rst | 552 ++ .../arista/eos/docs/arista.eos.eos_acls_module.rst | 3285 +++++++ .../eos/docs/arista.eos.eos_banner_module.rst | 180 + .../arista.eos.eos_bgp_address_family_module.rst | 2130 +++++ .../eos/docs/arista.eos.eos_bgp_global_module.rst | 8554 ++++++++++++++++++ .../arista/eos/docs/arista.eos.eos_bgp_module.rst | 986 ++ .../arista/eos/docs/arista.eos.eos_cliconf.rst | 100 + .../eos/docs/arista.eos.eos_command_module.rst | 427 + .../eos/docs/arista.eos.eos_config_module.rst | 546 ++ .../arista/eos/docs/arista.eos.eos_eapi_module.rst | 341 + .../eos/docs/arista.eos.eos_facts_module.rst | 427 + .../eos/docs/arista.eos.eos_hostname_module.rst | 392 + .../arista/eos/docs/arista.eos.eos_httpapi.rst | 81 + .../eos/docs/arista.eos.eos_interfaces_module.rst | 551 ++ .../docs/arista.eos.eos_l2_interfaces_module.rst | 567 ++ .../docs/arista.eos.eos_l3_interfaces_module.rst | 551 ++ .../docs/arista.eos.eos_lacp_interfaces_module.rst | 427 + .../arista/eos/docs/arista.eos.eos_lacp_module.rst | 327 + .../docs/arista.eos.eos_lag_interfaces_module.rst | 443 + .../eos/docs/arista.eos.eos_lldp_global_module.rst | 566 ++ .../docs/arista.eos.eos_lldp_interfaces_module.rst | 443 + .../arista/eos/docs/arista.eos.eos_lldp_module.rst | 124 + .../docs/arista.eos.eos_logging_global_module.rst | 1818 ++++ .../eos/docs/arista.eos.eos_logging_module.rst | 388 + .../eos/docs/arista.eos.eos_ntp_global_module.rst | 1605 ++++ .../docs/arista.eos.eos_ospf_interfaces_module.rst | 2026 +++++ .../eos/docs/arista.eos.eos_ospfv2_module.rst | 3752 ++++++++ .../eos/docs/arista.eos.eos_ospfv3_module.rst | 4751 ++++++++++ .../docs/arista.eos.eos_prefix_lists_module.rst | 1445 +++ .../eos/docs/arista.eos.eos_route_maps_module.rst | 3764 ++++++++ .../eos/docs/arista.eos.eos_snmp_server_module.rst | 4141 +++++++++ .../docs/arista.eos.eos_static_routes_module.rst | 1259 +++ .../eos/docs/arista.eos.eos_system_module.rst | 243 + .../arista/eos/docs/arista.eos.eos_user_module.rst | 446 + .../eos/docs/arista.eos.eos_vlans_module.rst | 420 + .../arista/eos/docs/arista.eos.eos_vrf_module.rst | 364 + ansible_collections/arista/eos/ignore-2.9.txt | 136 + ansible_collections/arista/eos/meta/runtime.yml | 86 + .../arista/eos/plugins/action/__init__.py | 0 .../arista/eos/plugins/action/acl_interfaces.py | 58 + .../arista/eos/plugins/action/acls.py | 58 + .../arista/eos/plugins/action/banner.py | 58 + .../arista/eos/plugins/action/bgp.py | 58 + .../eos/plugins/action/bgp_address_family.py | 58 + .../arista/eos/plugins/action/bgp_global.py | 58 + .../arista/eos/plugins/action/command.py | 58 + .../arista/eos/plugins/action/config.py | 58 + .../arista/eos/plugins/action/eapi.py | 58 + .../arista/eos/plugins/action/eos.py | 58 + .../arista/eos/plugins/action/facts.py | 58 + .../arista/eos/plugins/action/hostname.py | 58 + .../arista/eos/plugins/action/interface.py | 58 + .../arista/eos/plugins/action/interfaces.py | 58 + .../arista/eos/plugins/action/l2_interface.py | 58 + .../arista/eos/plugins/action/l2_interfaces.py | 58 + .../arista/eos/plugins/action/l3_interface.py | 58 + .../arista/eos/plugins/action/l3_interfaces.py | 58 + .../arista/eos/plugins/action/lacp.py | 58 + .../arista/eos/plugins/action/lacp_interfaces.py | 58 + .../arista/eos/plugins/action/lag_interfaces.py | 58 + .../arista/eos/plugins/action/linkagg.py | 58 + .../arista/eos/plugins/action/lldp.py | 58 + .../arista/eos/plugins/action/lldp_global.py | 58 + .../arista/eos/plugins/action/lldp_interfaces.py | 58 + .../arista/eos/plugins/action/logging.py | 58 + .../arista/eos/plugins/action/logging_global.py | 58 + .../arista/eos/plugins/action/ntp_global.py | 58 + .../arista/eos/plugins/action/ospf_interfaces.py | 58 + .../arista/eos/plugins/action/ospfv2.py | 58 + .../arista/eos/plugins/action/ospfv3.py | 58 + .../arista/eos/plugins/action/prefix_lists.py | 58 + .../arista/eos/plugins/action/route_maps.py | 58 + .../arista/eos/plugins/action/snmp_server.py | 58 + .../arista/eos/plugins/action/static_route.py | 58 + .../arista/eos/plugins/action/static_routes.py | 58 + .../arista/eos/plugins/action/system.py | 58 + .../arista/eos/plugins/action/user.py | 58 + .../arista/eos/plugins/action/vlan.py | 58 + .../arista/eos/plugins/action/vlans.py | 58 + .../arista/eos/plugins/action/vrf.py | 58 + .../arista/eos/plugins/cliconf/__init__.py | 0 .../arista/eos/plugins/cliconf/eos.py | 494 + .../arista/eos/plugins/filter/__init__.py | 0 .../arista/eos/plugins/httpapi/__init__.py | 0 .../arista/eos/plugins/httpapi/eos.py | 217 + .../arista/eos/plugins/inventory/__init__.py | 0 .../arista/eos/plugins/module_utils/__init__.py | 0 .../eos/plugins/module_utils/network/__init__.py | 0 .../plugins/module_utils/network/eos/__init__.py | 0 .../module_utils/network/eos/argspec/__init__.py | 0 .../network/eos/argspec/acl_interfaces/__init__.py | 0 .../eos/argspec/acl_interfaces/acl_interfaces.py | 85 + .../network/eos/argspec/acls/__init__.py | 0 .../module_utils/network/eos/argspec/acls/acls.py | 416 + .../eos/argspec/bgp_address_family/__init__.py | 0 .../bgp_address_family/bgp_address_family.py | 206 + .../network/eos/argspec/bgp_global/__init__.py | 0 .../network/eos/argspec/bgp_global/bgp_global.py | 1033 +++ .../network/eos/argspec/facts/__init__.py | 0 .../network/eos/argspec/facts/facts.py | 24 + .../network/eos/argspec/hostname/__init__.py | 0 .../network/eos/argspec/hostname/hostname.py | 50 + .../network/eos/argspec/interfaces/__init__.py | 0 .../network/eos/argspec/interfaces/interfaces.py | 72 + .../network/eos/argspec/l2_interfaces/__init__.py | 0 .../eos/argspec/l2_interfaces/l2_interfaces.py | 77 + .../network/eos/argspec/l3_interfaces/__init__.py | 0 .../eos/argspec/l3_interfaces/l3_interfaces.py | 76 + .../network/eos/argspec/lacp/__init__.py | 0 .../module_utils/network/eos/argspec/lacp/lacp.py | 63 + .../eos/argspec/lacp_interfaces/__init__.py | 0 .../eos/argspec/lacp_interfaces/lacp_interfaces.py | 69 + .../network/eos/argspec/lag_interfaces/__init__.py | 0 .../eos/argspec/lag_interfaces/lag_interfaces.py | 73 + .../network/eos/argspec/lldp_global/__init__.py | 0 .../network/eos/argspec/lldp_global/lldp_global.py | 75 + .../eos/argspec/lldp_interfaces/__init__.py | 0 .../eos/argspec/lldp_interfaces/lldp_interfaces.py | 65 + .../network/eos/argspec/logging_global/__init__.py | 0 .../eos/argspec/logging_global/logging_global.py | 253 + .../network/eos/argspec/ntp_global/__init__.py | 0 .../network/eos/argspec/ntp_global/ntp_global.py | 123 + .../eos/argspec/ospf_interfaces/__init__.py | 0 .../eos/argspec/ospf_interfaces/ospf_interfaces.py | 180 + .../network/eos/argspec/ospfv2/__init__.py | 0 .../network/eos/argspec/ospfv2/ospfv2.py | 340 + .../network/eos/argspec/ospfv3/__init__.py | 0 .../network/eos/argspec/ospfv3/ospfv3.py | 532 ++ .../network/eos/argspec/prefix_lists/__init__.py | 0 .../eos/argspec/prefix_lists/prefix_lists.py | 100 + .../network/eos/argspec/route_maps/__init__.py | 0 .../network/eos/argspec/route_maps/route_maps.py | 367 + .../network/eos/argspec/snmp_server/__init__.py | 0 .../network/eos/argspec/snmp_server/snmp_server.py | 389 + .../network/eos/argspec/static_routes/__init__.py | 0 .../eos/argspec/static_routes/static_routes.py | 97 + .../network/eos/argspec/vlans/__init__.py | 0 .../network/eos/argspec/vlans/vlans.py | 64 + .../module_utils/network/eos/config/__init__.py | 0 .../network/eos/config/acl_interfaces/__init__.py | 0 .../eos/config/acl_interfaces/acl_interfaces.py | 481 + .../network/eos/config/acls/__init__.py | 0 .../module_utils/network/eos/config/acls/acls.py | 661 ++ .../eos/config/bgp_address_family/__init__.py | 0 .../bgp_address_family/bgp_address_family.py | 293 + .../network/eos/config/bgp_global/__init__.py | 0 .../network/eos/config/bgp_global/bgp_global.py | 422 + .../network/eos/config/hostname/__init__.py | 0 .../network/eos/config/hostname/hostname.py | 76 + .../network/eos/config/interfaces/__init__.py | 0 .../network/eos/config/interfaces/interfaces.py | 309 + .../network/eos/config/l2_interfaces/__init__.py | 0 .../eos/config/l2_interfaces/l2_interfaces.py | 365 + .../network/eos/config/l3_interfaces/__init__.py | 0 .../eos/config/l3_interfaces/l3_interfaces.py | 351 + .../network/eos/config/lacp/__init__.py | 0 .../module_utils/network/eos/config/lacp/lacp.py | 201 + .../network/eos/config/lacp_interfaces/__init__.py | 0 .../eos/config/lacp_interfaces/lacp_interfaces.py | 262 + .../network/eos/config/lag_interfaces/__init__.py | 0 .../eos/config/lag_interfaces/lag_interfaces.py | 275 + .../network/eos/config/lldp_global/__init__.py | 0 .../network/eos/config/lldp_global/lldp_global.py | 215 + .../network/eos/config/lldp_interfaces/__init__.py | 0 .../eos/config/lldp_interfaces/lldp_interfaces.py | 264 + .../network/eos/config/logging_global/__init__.py | 0 .../eos/config/logging_global/logging_global.py | 190 + .../network/eos/config/ntp_global/__init__.py | 0 .../network/eos/config/ntp_global/ntp_global.py | 249 + .../network/eos/config/ospf_interfaces/__init__.py | 0 .../eos/config/ospf_interfaces/ospf_interfaces.py | 212 + .../network/eos/config/ospfv2/__init__.py | 0 .../network/eos/config/ospfv2/ospfv2.py | 840 ++ .../network/eos/config/ospfv3/__init__.py | 0 .../network/eos/config/ospfv3/ospfv3.py | 392 + .../network/eos/config/prefix_lists/__init__.py | 0 .../eos/config/prefix_lists/prefix_lists.py | 217 + .../network/eos/config/route_maps/__init__.py | 0 .../network/eos/config/route_maps/route_maps.py | 349 + .../network/eos/config/snmp_server/__init__.py | 0 .../network/eos/config/snmp_server/snmp_server.py | 243 + .../network/eos/config/static_routes/__init__.py | 0 .../eos/config/static_routes/static_routes.py | 369 + .../network/eos/config/vlans/__init__.py | 0 .../module_utils/network/eos/config/vlans/vlans.py | 262 + .../eos/plugins/module_utils/network/eos/eos.py | 568 ++ .../module_utils/network/eos/facts/__init__.py | 0 .../network/eos/facts/acl_interfaces/__init__.py | 0 .../eos/facts/acl_interfaces/acl_interfaces.py | 149 + .../network/eos/facts/acls/__init__.py | 0 .../module_utils/network/eos/facts/acls/acls.py | 392 + .../eos/facts/bgp_address_family/__init__.py | 0 .../facts/bgp_address_family/bgp_address_family.py | 120 + .../network/eos/facts/bgp_global/__init__.py | 0 .../network/eos/facts/bgp_global/bgp_global.py | 136 + .../module_utils/network/eos/facts/facts.py | 160 + .../network/eos/facts/hostname/__init__.py | 0 .../network/eos/facts/hostname/hostname.py | 76 + .../network/eos/facts/interfaces/__init__.py | 0 .../network/eos/facts/interfaces/interfaces.py | 116 + .../network/eos/facts/l2_interfaces/__init__.py | 0 .../eos/facts/l2_interfaces/l2_interfaces.py | 120 + .../network/eos/facts/l3_interfaces/__init__.py | 0 .../eos/facts/l3_interfaces/l3_interfaces.py | 124 + .../network/eos/facts/lacp/__init__.py | 0 .../module_utils/network/eos/facts/lacp/lacp.py | 106 + .../network/eos/facts/lacp_interfaces/__init__.py | 0 .../eos/facts/lacp_interfaces/lacp_interfaces.py | 107 + .../network/eos/facts/lag_interfaces/__init__.py | 0 .../eos/facts/lag_interfaces/lag_interfaces.py | 124 + .../network/eos/facts/legacy/__init__.py | 0 .../module_utils/network/eos/facts/legacy/base.py | 180 + .../network/eos/facts/lldp_global/__init__.py | 0 .../network/eos/facts/lldp_global/lldp_global.py | 102 + .../network/eos/facts/lldp_interfaces/__init__.py | 0 .../eos/facts/lldp_interfaces/lldp_interfaces.py | 106 + .../network/eos/facts/logging_global/__init__.py | 0 .../eos/facts/logging_global/logging_global.py | 98 + .../network/eos/facts/ntp_global/__init__.py | 0 .../network/eos/facts/ntp_global/ntp_global.py | 97 + .../network/eos/facts/ospf_interfaces/__init__.py | 0 .../eos/facts/ospf_interfaces/ospf_interfaces.py | 107 + .../network/eos/facts/ospfv2/__init__.py | 0 .../network/eos/facts/ospfv2/ospfv2.py | 510 ++ .../network/eos/facts/ospfv3/__init__.py | 0 .../network/eos/facts/ospfv3/ospfv3.py | 121 + .../network/eos/facts/prefix_lists/__init__.py | 0 .../network/eos/facts/prefix_lists/prefix_lists.py | 95 + .../network/eos/facts/route_maps/__init__.py | 0 .../network/eos/facts/route_maps/route_maps.py | 143 + .../network/eos/facts/snmp_server/__init__.py | 0 .../network/eos/facts/snmp_server/snmp_server.py | 117 + .../network/eos/facts/static_routes/__init__.py | 0 .../eos/facts/static_routes/static_routes.py | 243 + .../network/eos/facts/vlans/__init__.py | 0 .../module_utils/network/eos/facts/vlans/vlans.py | 125 + .../module_utils/network/eos/providers/__init__.py | 0 .../network/eos/providers/cli/__init__.py | 0 .../network/eos/providers/cli/config/__init__.py | 0 .../eos/providers/cli/config/bgp/__init__.py | 0 .../eos/providers/cli/config/bgp/address_family.py | 149 + .../eos/providers/cli/config/bgp/neighbors.py | 194 + .../eos/providers/cli/config/bgp/process.py | 186 + .../module_utils/network/eos/providers/module.py | 75 + .../network/eos/providers/providers.py | 127 + .../network/eos/rm_templates/__init__.py | 0 .../network/eos/rm_templates/bgp_address_family.py | 672 ++ .../network/eos/rm_templates/bgp_global.py | 2965 ++++++ .../network/eos/rm_templates/hostname.py | 48 + .../network/eos/rm_templates/logging_global.py | 475 + .../network/eos/rm_templates/ntp_global.py | 273 + .../network/eos/rm_templates/ospf_interfaces.py | 1094 +++ .../network/eos/rm_templates/ospfv3.py | 1091 +++ .../network/eos/rm_templates/prefix_lists.py | 166 + .../network/eos/rm_templates/route_maps.py | 1697 ++++ .../network/eos/rm_templates/snmp_server.py | 1232 +++ .../module_utils/network/eos/utils/__init__.py | 0 .../module_utils/network/eos/utils/utils.py | 84 + .../arista/eos/plugins/modules/__init__.py | 0 .../eos/plugins/modules/eos_acl_interfaces.py | 423 + .../arista/eos/plugins/modules/eos_acls.py | 904 ++ .../arista/eos/plugins/modules/eos_banner.py | 199 + .../arista/eos/plugins/modules/eos_bgp.py | 469 + .../eos/plugins/modules/eos_bgp_address_family.py | 1351 +++ .../arista/eos/plugins/modules/eos_bgp_global.py | 2353 +++++ .../arista/eos/plugins/modules/eos_command.py | 320 + .../arista/eos/plugins/modules/eos_config.py | 630 ++ .../arista/eos/plugins/modules/eos_eapi.py | 437 + .../arista/eos/plugins/modules/eos_facts.py | 210 + .../arista/eos/plugins/modules/eos_hostname.py | 333 + .../arista/eos/plugins/modules/eos_interfaces.py | 415 + .../eos/plugins/modules/eos_l2_interfaces.py | 430 + .../eos/plugins/modules/eos_l3_interfaces.py | 412 + .../arista/eos/plugins/modules/eos_lacp.py | 247 + .../eos/plugins/modules/eos_lacp_interfaces.py | 340 + .../eos/plugins/modules/eos_lag_interfaces.py | 342 + .../arista/eos/plugins/modules/eos_lldp.py | 117 + .../arista/eos/plugins/modules/eos_lldp_global.py | 347 + .../eos/plugins/modules/eos_lldp_interfaces.py | 346 + .../arista/eos/plugins/modules/eos_logging.py | 505 ++ .../eos/plugins/modules/eos_logging_global.py | 942 ++ .../arista/eos/plugins/modules/eos_ntp_global.py | 1053 +++ .../eos/plugins/modules/eos_ospf_interfaces.py | 1230 +++ .../arista/eos/plugins/modules/eos_ospfv2.py | 1563 ++++ .../arista/eos/plugins/modules/eos_ospfv3.py | 1583 ++++ .../arista/eos/plugins/modules/eos_prefix_lists.py | 1197 +++ .../arista/eos/plugins/modules/eos_route_maps.py | 1406 +++ .../arista/eos/plugins/modules/eos_snmp_server.py | 1522 ++++ .../eos/plugins/modules/eos_static_routes.py | 969 ++ .../arista/eos/plugins/modules/eos_system.py | 378 + .../arista/eos/plugins/modules/eos_user.py | 491 + .../arista/eos/plugins/modules/eos_vlans.py | 329 + .../arista/eos/plugins/modules/eos_vrf.py | 427 + .../arista/eos/plugins/terminal/__init__.py | 0 .../arista/eos/plugins/terminal/eos.py | 113 + ansible_collections/arista/eos/pyproject.toml | 7 + ansible_collections/arista/eos/requirements.txt | 2 + .../arista/eos/test-requirements.txt | 10 + ansible_collections/arista/eos/tests/.gitignore | 1 + .../eos/tests/integration/network-integration.cfg | 4 + .../eos/tests/integration/target-prefixes.network | 1 + .../targets/eos_acl_interfaces/defaults/main.yaml | 3 + .../targets/eos_acl_interfaces/meta/main.yaml | 3 + .../targets/eos_acl_interfaces/tasks/cli.yaml | 33 + .../targets/eos_acl_interfaces/tasks/eapi.yaml | 33 + .../targets/eos_acl_interfaces/tasks/main.yaml | 10 + .../eos_acl_interfaces/tests/common/_parsed.cfg | 6 + .../eos_acl_interfaces/tests/common/_populate.yaml | 27 + .../tests/common/_remove_config.yaml | 9 + .../eos_acl_interfaces/tests/common/deleted.yaml | 56 + .../tests/common/empty_config.yaml | 61 + .../eos_acl_interfaces/tests/common/gathered.yaml | 23 + .../eos_acl_interfaces/tests/common/merged.yaml | 51 + .../tests/common/overridden.yaml | 39 + .../eos_acl_interfaces/tests/common/parsed.yaml | 17 + .../eos_acl_interfaces/tests/common/rendered.yaml | 39 + .../eos_acl_interfaces/tests/common/replaced.yaml | 39 + .../eos_acl_interfaces/tests/common/rtt.yaml | 70 + .../targets/eos_acl_interfaces/vars/main.yaml | 79 + .../targets/eos_acls/defaults/main.yaml | 3 + .../integration/targets/eos_acls/meta/main.yaml | 3 + .../integration/targets/eos_acls/tasks/cli.yaml | 32 + .../integration/targets/eos_acls/tasks/eapi.yaml | 32 + .../integration/targets/eos_acls/tasks/main.yaml | 10 + .../targets/eos_acls/tests/common/_parsed.cfg | 4 + .../targets/eos_acls/tests/common/_parsed_cfg.yaml | 10 + .../targets/eos_acls/tests/common/_populate.yaml | 53 + .../eos_acls/tests/common/_remove_config.yaml | 9 + .../targets/eos_acls/tests/common/deleted.yaml | 148 + .../targets/eos_acls/tests/common/gathered.yaml | 37 + .../targets/eos_acls/tests/common/merged.yaml | 160 + .../targets/eos_acls/tests/common/overridden.yaml | 74 + .../targets/eos_acls/tests/common/parsed.yaml | 31 + .../targets/eos_acls/tests/common/rendered.yaml | 83 + .../targets/eos_acls/tests/common/replaced.yaml | 99 + .../targets/eos_acls/tests/common/rtt.yaml | 109 + .../integration/targets/eos_acls/vars/main.yaml | 109 + .../targets/eos_banner/defaults/main.yaml | 3 + .../integration/targets/eos_banner/meta/main.yml | 3 + .../integration/targets/eos_banner/tasks/cli.yaml | 19 + .../integration/targets/eos_banner/tasks/eapi.yaml | 19 + .../integration/targets/eos_banner/tasks/main.yaml | 10 + .../targets/eos_banner/tests/cli/basic-login.yaml | 56 + .../targets/eos_banner/tests/cli/basic-motd.yaml | 64 + .../targets/eos_banner/tests/eapi/basic-login.yaml | 57 + .../targets/eos_banner/tests/eapi/basic-motd.yaml | 64 + .../integration/targets/eos_bgp/defaults/main.yaml | 3 + .../integration/targets/eos_bgp/meta/main.yaml | 3 + .../integration/targets/eos_bgp/tasks/cli.yaml | 19 + .../integration/targets/eos_bgp/tasks/main.yaml | 5 + .../targets/eos_bgp/tests/cli/basic.yaml | 399 + .../eos_bgp_address_family/defaults/main.yaml | 3 + .../targets/eos_bgp_address_family/meta/main.yaml | 3 + .../targets/eos_bgp_address_family/tasks/cli.yaml | 33 + .../targets/eos_bgp_address_family/tasks/eapi.yaml | 33 + .../targets/eos_bgp_address_family/tasks/main.yaml | 16 + .../eos_bgp_address_family/tasks/redirection.yaml | 19 + .../eos_bgp_address_family/templates/populate.cfg | 23 + .../tests/common/_parsed.cfg | 23 + .../tests/common/_populate.yaml | 5 + .../tests/common/_redirection.yaml | 63 + .../tests/common/_remove_config.yaml | 6 + .../tests/common/deleted.yaml | 47 + .../tests/common/empty_config.yaml | 65 + .../tests/common/gathered.yaml | 25 + .../tests/common/merged.yaml | 63 + .../tests/common/overridden.yaml | 51 + .../tests/common/parsed.yaml | 17 + .../tests/common/rendered.yaml | 47 + .../tests/common/replaced.yaml | 51 + .../eos_bgp_address_family/tests/common/rtt.yaml | 85 + .../targets/eos_bgp_address_family/vars/main.yaml | 186 + .../targets/eos_bgp_global/defaults/main.yaml | 3 + .../targets/eos_bgp_global/meta/main.yaml | 3 + .../targets/eos_bgp_global/tasks/cli.yaml | 33 + .../targets/eos_bgp_global/tasks/eapi.yaml | 33 + .../targets/eos_bgp_global/tasks/main.yaml | 10 + .../targets/eos_bgp_global/templates/populate.cfg | 22 + .../eos_bgp_global/templates/populate_af.cfg | 4 + .../eos_bgp_global/tests/common/_parsed.cfg | 22 + .../eos_bgp_global/tests/common/_populate.yaml | 5 + .../eos_bgp_global/tests/common/_populate_af.yaml | 5 + .../tests/common/_remove_config.yaml | 6 + .../eos_bgp_global/tests/common/deleted.yaml | 42 + .../eos_bgp_global/tests/common/empty_config.yaml | 52 + .../eos_bgp_global/tests/common/gathered.yaml | 25 + .../eos_bgp_global/tests/common/merged.yaml | 83 + .../eos_bgp_global/tests/common/parsed.yaml | 17 + .../eos_bgp_global/tests/common/purged.yaml | 42 + .../eos_bgp_global/tests/common/rendered.yaml | 66 + .../eos_bgp_global/tests/common/replaced.yaml | 68 + .../targets/eos_bgp_global/tests/common/rtt.yaml | 105 + .../targets/eos_bgp_global/vars/main.yaml | 195 + .../targets/eos_command/defaults/main.yaml | 2 + .../integration/targets/eos_command/meta/main.yml | 3 + .../integration/targets/eos_command/tasks/cli.yaml | 19 + .../targets/eos_command/tasks/eapi.yaml | 19 + .../targets/eos_command/tasks/main.yaml | 10 + .../eos_command/tests/cli/bad_operator.yaml | 19 + .../targets/eos_command/tests/cli/cli_command.yaml | 63 + .../targets/eos_command/tests/cli/contains.yaml | 19 + .../targets/eos_command/tests/cli/equal.yaml | 32 + .../targets/eos_command/tests/cli/greaterthan.yaml | 32 + .../eos_command/tests/cli/greaterthanorequal.yaml | 36 + .../targets/eos_command/tests/cli/invalid.yaml | 29 + .../targets/eos_command/tests/cli/lessthan.yaml | 32 + .../eos_command/tests/cli/lessthanorequal.yaml | 34 + .../targets/eos_command/tests/cli/notequal.yaml | 32 + .../targets/eos_command/tests/cli/output.yaml | 27 + .../targets/eos_command/tests/cli/timeout.yaml | 18 + .../targets/eos_command/tests/cli/version.yaml | 31 + .../eos_command/tests/eapi/bad_operator.yaml | 19 + .../targets/eos_command/tests/eapi/contains.yaml | 19 + .../targets/eos_command/tests/eapi/equal.yaml | 32 + .../eos_command/tests/eapi/greaterthan.yaml | 32 + .../eos_command/tests/eapi/greaterthanorequal.yaml | 36 + .../targets/eos_command/tests/eapi/invalid.yaml | 29 + .../targets/eos_command/tests/eapi/lessthan.yaml | 32 + .../eos_command/tests/eapi/lessthanorequal.yaml | 36 + .../targets/eos_command/tests/eapi/notequal.yaml | 32 + .../targets/eos_command/tests/eapi/output.yaml | 27 + .../targets/eos_command/tests/eapi/timeout.yaml | 19 + .../targets/eos_command/tests/eapi/version.yaml | 31 + .../integration/targets/eos_config/config.txt | 20 + .../targets/eos_config/defaults/main.yaml | 3 + .../integration/targets/eos_config/meta/main.yml | 3 + .../integration/targets/eos_config/tasks/cli.yaml | 19 + .../targets/eos_config/tasks/cli_config.yaml | 19 + .../integration/targets/eos_config/tasks/eapi.yaml | 19 + .../integration/targets/eos_config/tasks/main.yaml | 21 + .../targets/eos_config/tasks/redirection.yaml | 19 + .../targets/eos_config/templates/basic/cmds.j2 | 4 + .../targets/eos_config/templates/basic/config.j2 | 3 + .../eos_config/templates/defaults/config.j2 | 3 + .../targets/eos_config/templates/defaults/test.j2 | 3 + .../targets/eos_config/tests/cli/backup.yaml | 133 + .../targets/eos_config/tests/cli/check_mode.yaml | 93 + .../targets/eos_config/tests/cli/config.yaml | 51 + .../targets/eos_config/tests/cli/defaults.yaml | 42 + .../eos_config/tests/cli/diff_against_config.yaml | 48 + .../targets/eos_config/tests/cli/save.yaml | 31 + .../targets/eos_config/tests/cli/src_basic.yaml | 37 + .../targets/eos_config/tests/cli/src_invalid.yaml | 17 + .../eos_config/tests/cli/src_match_none.yaml | 39 + .../targets/eos_config/tests/cli/sublevel.yaml | 40 + .../eos_config/tests/cli/sublevel_block.yaml | 63 + .../eos_config/tests/cli/sublevel_exact.yaml | 67 + .../eos_config/tests/cli/sublevel_strict.yaml | 67 + .../tests/cli/sublevel_strict_mul_parents.yaml | 84 + .../targets/eos_config/tests/cli/toplevel.yaml | 37 + .../eos_config/tests/cli/toplevel_after.yaml | 46 + .../eos_config/tests/cli/toplevel_before.yaml | 46 + .../eos_config/tests/cli_config/cli_backup.yaml | 114 + .../eos_config/tests/cli_config/cli_basic.yaml | 36 + .../targets/eos_config/tests/eapi/backup.yaml | 50 + .../targets/eos_config/tests/eapi/defaults.yaml | 42 + .../targets/eos_config/tests/eapi/save.yaml | 31 + .../targets/eos_config/tests/eapi/src_basic.yaml | 36 + .../targets/eos_config/tests/eapi/src_invalid.yaml | 16 + .../eos_config/tests/eapi/src_match_none.yaml | 37 + .../targets/eos_config/tests/eapi/sublevel.yaml | 41 + .../eos_config/tests/eapi/sublevel_block.yaml | 59 + .../eos_config/tests/eapi/sublevel_exact.yaml | 65 + .../eos_config/tests/eapi/sublevel_strict.yaml | 64 + .../targets/eos_config/tests/eapi/toplevel.yaml | 37 + .../eos_config/tests/eapi/toplevel_after.yaml | 44 + .../eos_config/tests/eapi/toplevel_before.yaml | 44 + .../tests/redirection/cli/shortname.yaml | 38 + .../targets/eos_eapi/defaults/main.yaml | 3 + .../integration/targets/eos_eapi/meta/main.yml | 3 + .../integration/targets/eos_eapi/tasks/cli.yaml | 19 + .../integration/targets/eos_eapi/tasks/main.yaml | 5 + .../targets/eos_eapi/tests/cli/badtransport.yaml | 14 + .../targets/eos_eapi/tests/cli/config.yaml | 44 + .../targets/eos_eapi/tests/cli/configure.yaml | 41 + .../targets/eos_eapi/tests/cli/off.yaml | 44 + .../integration/targets/eos_eapi/tests/cli/on.yaml | 42 + .../targets/eos_eapi/tests/cli/start.yaml | 30 + .../targets/eos_eapi/tests/cli/stop.yaml | 30 + .../targets/eos_eapi/tests/cli/vrf.yaml | 42 + .../targets/eos_eapi/tests/cli/zzz_reset.1 | 35 + .../targets/eos_facts/defaults/main.yaml | 2 + .../integration/targets/eos_facts/meta/main.yml | 3 + .../integration/targets/eos_facts/tasks/cli.yaml | 19 + .../integration/targets/eos_facts/tasks/eapi.yaml | 19 + .../integration/targets/eos_facts/tasks/main.yaml | 10 + .../targets/eos_facts/tests/cli/all_facts.yaml | 36 + .../targets/eos_facts/tests/cli/default_facts.yaml | 23 + .../eos_facts/tests/cli/invalid_subset.yaml | 20 + .../targets/eos_facts/tests/cli/not_hardware.yaml | 21 + .../targets/eos_facts/tests/eapi/all_facts.yaml | 22 + .../eos_facts/tests/eapi/default_facts.yaml | 24 + .../eos_facts/tests/eapi/invalid_subset.yaml | 20 + .../targets/eos_facts/tests/eapi/not_hardware.yaml | 21 + .../targets/eos_hostname/defaults/main.yaml | 3 + .../targets/eos_hostname/meta/main.yaml | 3 + .../targets/eos_hostname/tasks/cli.yaml | 33 + .../targets/eos_hostname/tasks/eapi.yaml | 33 + .../targets/eos_hostname/tasks/main.yaml | 10 + .../targets/eos_hostname/templates/populate.cfg | 1 + .../targets/eos_hostname/tests/common/_parsed.cfg | 1 + .../eos_hostname/tests/common/_populate.yaml | 5 + .../eos_hostname/tests/common/_remove_config.yaml | 6 + .../targets/eos_hostname/tests/common/deleted.yaml | 38 + .../eos_hostname/tests/common/empty_config.yaml | 64 + .../eos_hostname/tests/common/gathered.yaml | 23 + .../targets/eos_hostname/tests/common/merged.yaml | 32 + .../eos_hostname/tests/common/overridden.yaml | 37 + .../targets/eos_hostname/tests/common/parsed.yaml | 17 + .../eos_hostname/tests/common/rendered.yaml | 20 + .../eos_hostname/tests/common/replaced.yaml | 36 + .../targets/eos_hostname/vars/main.yaml | 18 + .../targets/eos_interfaces/defaults/main.yaml | 3 + .../targets/eos_interfaces/meta/main.yml | 3 + .../targets/eos_interfaces/tasks/cli.yaml | 33 + .../targets/eos_interfaces/tasks/eapi.yaml | 33 + .../targets/eos_interfaces/tasks/main.yaml | 10 + .../targets/eos_interfaces/templates/reset.cfg | 12 + .../eos_interfaces/tests/common/_parsed.cfg | 7 + .../eos_interfaces/tests/common/_reset_config.yaml | 5 + .../eos_interfaces/tests/common/deleted.yaml | 30 + .../eos_interfaces/tests/common/empty_config.yaml | 66 + .../eos_interfaces/tests/common/gathered.yaml | 24 + .../eos_interfaces/tests/common/merged.yaml | 40 + .../eos_interfaces/tests/common/overridden.yaml | 42 + .../eos_interfaces/tests/common/parsed.yaml | 17 + .../eos_interfaces/tests/common/rendered.yaml | 28 + .../eos_interfaces/tests/common/replaced.yaml | 39 + .../targets/eos_interfaces/tests/common/rtt.yaml | 48 + .../targets/eos_interfaces/vars/main.yaml | 17 + .../targets/eos_l2_interfaces/defaults/main.yaml | 3 + .../targets/eos_l2_interfaces/meta/main.yml | 3 + .../targets/eos_l2_interfaces/tasks/cli.yaml | 38 + .../targets/eos_l2_interfaces/tasks/eapi.yaml | 37 + .../targets/eos_l2_interfaces/tasks/main.yaml | 10 + .../eos_l2_interfaces/tests/common/_cleanup.yml | 14 + .../eos_l2_interfaces/tests/common/_parsed.cfg | 7 + .../tests/common/_reset_config.yaml | 14 + .../eos_l2_interfaces/tests/common/deleted.yaml | 33 + .../tests/common/empty_config.yaml | 66 + .../eos_l2_interfaces/tests/common/gathered.yaml | 24 + .../eos_l2_interfaces/tests/common/merged.yaml | 38 + .../eos_l2_interfaces/tests/common/overridden.yaml | 35 + .../eos_l2_interfaces/tests/common/parsed.yaml | 17 + .../eos_l2_interfaces/tests/common/rendered.yaml | 30 + .../eos_l2_interfaces/tests/common/replaced.yaml | 36 + .../eos_l2_interfaces/tests/common/rtt.yaml | 48 + .../targets/eos_l2_interfaces/vars/main.yaml | 17 + .../targets/eos_l3_interfaces/defaults/main.yaml | 3 + .../targets/eos_l3_interfaces/meta/main.yaml | 3 + .../targets/eos_l3_interfaces/tasks/cli.yaml | 33 + .../targets/eos_l3_interfaces/tasks/eapi.yaml | 32 + .../targets/eos_l3_interfaces/tasks/main.yaml | 10 + .../targets/eos_l3_interfaces/templates/reset.cfg | 10 + .../eos_l3_interfaces/tests/common/_parsed.cfg | 6 + .../tests/common/_reset_config.yaml | 5 + .../eos_l3_interfaces/tests/common/deleted.yaml | 38 + .../tests/common/empty_config.yaml | 66 + .../eos_l3_interfaces/tests/common/gathered.yaml | 24 + .../eos_l3_interfaces/tests/common/merged.yaml | 38 + .../eos_l3_interfaces/tests/common/overridden.yaml | 44 + .../eos_l3_interfaces/tests/common/parsed.yaml | 17 + .../eos_l3_interfaces/tests/common/rendered.yaml | 23 + .../eos_l3_interfaces/tests/common/replaced.yaml | 45 + .../eos_l3_interfaces/tests/common/rtt.yaml | 48 + .../targets/eos_l3_interfaces/vars/main.yaml | 15 + .../targets/eos_lacp/defaults/main.yaml | 3 + .../integration/targets/eos_lacp/meta/main.yml | 3 + .../integration/targets/eos_lacp/tasks/cli.yaml | 33 + .../integration/targets/eos_lacp/tasks/eapi.yaml | 33 + .../integration/targets/eos_lacp/tasks/main.yaml | 10 + .../targets/eos_lacp/tests/common/_parsed.cfg | 1 + .../eos_lacp/tests/common/_reset_config.yaml | 19 + .../targets/eos_lacp/tests/common/deleted.yaml | 28 + .../eos_lacp/tests/common/empty_config.yaml | 54 + .../targets/eos_lacp/tests/common/gathered.yaml | 23 + .../targets/eos_lacp/tests/common/merged.yaml | 34 + .../targets/eos_lacp/tests/common/parsed.yaml | 22 + .../targets/eos_lacp/tests/common/rendered.yaml | 27 + .../targets/eos_lacp/tests/common/replaced.yaml | 34 + .../targets/eos_lacp_interfaces/defaults/main.yaml | 3 + .../targets/eos_lacp_interfaces/meta/main.yml | 3 + .../targets/eos_lacp_interfaces/tasks/cli.yaml | 33 + .../targets/eos_lacp_interfaces/tasks/eapi.yaml | 33 + .../targets/eos_lacp_interfaces/tasks/main.yaml | 10 + .../eos_lacp_interfaces/tests/common/_parsed.cfg | 4 + .../tests/common/_reset_config.yaml | 28 + .../eos_lacp_interfaces/tests/common/deleted.yaml | 42 + .../tests/common/empty_config.yaml | 66 + .../eos_lacp_interfaces/tests/common/gathered.yaml | 23 + .../eos_lacp_interfaces/tests/common/merged.yaml | 46 + .../tests/common/overridden.yaml | 40 + .../eos_lacp_interfaces/tests/common/parsed.yaml | 24 + .../eos_lacp_interfaces/tests/common/rendered.yaml | 32 + .../eos_lacp_interfaces/tests/common/replaced.yaml | 44 + .../eos_lacp_interfaces/tests/common/rtt.yaml | 60 + .../targets/eos_lag_interfaces/defaults/main.yaml | 3 + .../targets/eos_lag_interfaces/meta/main.yaml | 3 + .../targets/eos_lag_interfaces/tasks/cli.yaml | 33 + .../targets/eos_lag_interfaces/tasks/eapi.yaml | 33 + .../targets/eos_lag_interfaces/tasks/main.yaml | 10 + .../eos_lag_interfaces/tests/cli/_parsed.cfg | 4 + .../tests/cli/_reset_config.yaml | 23 + .../eos_lag_interfaces/tests/cli/deleted.yaml | 32 + .../eos_lag_interfaces/tests/cli/empty_config.yaml | 66 + .../eos_lag_interfaces/tests/cli/gathered.yaml | 23 + .../eos_lag_interfaces/tests/cli/merged.yaml | 71 + .../eos_lag_interfaces/tests/cli/overridden.yaml | 41 + .../eos_lag_interfaces/tests/cli/parsed.yaml | 17 + .../eos_lag_interfaces/tests/cli/rendered.yaml | 22 + .../eos_lag_interfaces/tests/cli/replaced.yaml | 49 + .../targets/eos_lag_interfaces/vars/main.yaml | 15 + .../targets/eos_lldp/defaults/main.yaml | 3 + .../integration/targets/eos_lldp/meta/main.yaml | 3 + .../integration/targets/eos_lldp/tasks/cli.yaml | 19 + .../integration/targets/eos_lldp/tasks/eapi.yaml | 19 + .../integration/targets/eos_lldp/tasks/main.yaml | 10 + .../targets/eos_lldp/tests/cli/basic.yaml | 53 + .../targets/eos_lldp/tests/eapi/basic.yaml | 53 + .../targets/eos_lldp_global/defaults/main.yaml | 3 + .../targets/eos_lldp_global/meta/main.yml | 3 + .../targets/eos_lldp_global/tasks/cli.yaml | 33 + .../targets/eos_lldp_global/tasks/eapi.yaml | 33 + .../targets/eos_lldp_global/tasks/main.yaml | 10 + .../eos_lldp_global/tests/common/_parsed.cfg | 5 + .../tests/common/_reset_config.yaml | 28 + .../eos_lldp_global/tests/common/deleted.yaml | 28 + .../eos_lldp_global/tests/common/empty_config.yaml | 54 + .../eos_lldp_global/tests/common/gathered.yaml | 23 + .../eos_lldp_global/tests/common/merged.yaml | 46 + .../eos_lldp_global/tests/common/parsed.yaml | 17 + .../eos_lldp_global/tests/common/rendered.yaml | 21 + .../eos_lldp_global/tests/common/replaced.yaml | 44 + .../targets/eos_lldp_global/vars/main.yaml | 17 + .../targets/eos_lldp_interfaces/defaults/main.yaml | 3 + .../targets/eos_lldp_interfaces/meta/main.yml | 3 + .../targets/eos_lldp_interfaces/tasks/cli.yaml | 33 + .../targets/eos_lldp_interfaces/tasks/eapi.yaml | 33 + .../targets/eos_lldp_interfaces/tasks/main.yaml | 10 + .../eos_lldp_interfaces/tests/common/_parsed.cfg | 4 + .../tests/common/_reset_config.yaml | 28 + .../eos_lldp_interfaces/tests/common/deleted.yaml | 38 + .../tests/common/empty_config.yaml | 66 + .../eos_lldp_interfaces/tests/common/gathered.yaml | 23 + .../eos_lldp_interfaces/tests/common/merged.yaml | 49 + .../tests/common/overridden.yaml | 37 + .../eos_lldp_interfaces/tests/common/parsed.yaml | 24 + .../eos_lldp_interfaces/tests/common/rendered.yaml | 32 + .../eos_lldp_interfaces/tests/common/replaced.yaml | 45 + .../eos_lldp_interfaces/tests/common/rtt.yaml | 59 + .../targets/eos_logging/defaults/main.yaml | 2 + .../integration/targets/eos_logging/meta/main.yaml | 3 + .../integration/targets/eos_logging/tasks/cli.yaml | 19 + .../targets/eos_logging/tasks/eapi.yaml | 19 + .../targets/eos_logging/tasks/main.yaml | 10 + .../targets/eos_logging/tests/cli/basic.yaml | 154 + .../targets/eos_logging/tests/eapi/basic.yaml | 96 + .../targets/eos_logging_global/defaults/main.yaml | 3 + .../targets/eos_logging_global/meta/main.yaml | 3 + .../targets/eos_logging_global/tasks/cli.yaml | 33 + .../targets/eos_logging_global/tasks/eapi.yaml | 33 + .../targets/eos_logging_global/tasks/main.yaml | 10 + .../eos_logging_global/templates/populate.cfg | 9 + .../eos_logging_global/tests/common/_parsed.cfg | 9 + .../eos_logging_global/tests/common/_populate.yaml | 5 + .../tests/common/_remove_config.yaml | 6 + .../eos_logging_global/tests/common/deleted.yaml | 39 + .../tests/common/empty_config.yaml | 65 + .../eos_logging_global/tests/common/gathered.yaml | 23 + .../eos_logging_global/tests/common/merged.yaml | 57 + .../tests/common/overridden.yaml | 52 + .../eos_logging_global/tests/common/parsed.yaml | 17 + .../eos_logging_global/tests/common/rendered.yaml | 46 + .../eos_logging_global/tests/common/replaced.yaml | 52 + .../targets/eos_logging_global/vars/main.yaml | 87 + .../targets/eos_ntp_global/defaults/main.yaml | 3 + .../targets/eos_ntp_global/meta/main.yaml | 3 + .../targets/eos_ntp_global/tasks/cli.yaml | 33 + .../targets/eos_ntp_global/tasks/eapi.yaml | 33 + .../targets/eos_ntp_global/tasks/main.yaml | 10 + .../targets/eos_ntp_global/templates/populate.cfg | 11 + .../eos_ntp_global/tests/common/_parsed.cfg | 11 + .../eos_ntp_global/tests/common/_populate.yaml | 5 + .../tests/common/_remove_config.yaml | 6 + .../eos_ntp_global/tests/common/deleted.yaml | 38 + .../eos_ntp_global/tests/common/empty_config.yaml | 64 + .../eos_ntp_global/tests/common/gathered.yaml | 23 + .../eos_ntp_global/tests/common/merged.yaml | 69 + .../eos_ntp_global/tests/common/overridden.yaml | 51 + .../eos_ntp_global/tests/common/parsed.yaml | 17 + .../eos_ntp_global/tests/common/rendered.yaml | 57 + .../eos_ntp_global/tests/common/replaced.yaml | 51 + .../targets/eos_ntp_global/vars/main.yaml | 102 + .../targets/eos_ospf_interfaces/defaults/main.yaml | 3 + .../targets/eos_ospf_interfaces/meta/main.yaml | 3 + .../targets/eos_ospf_interfaces/tasks/cli.yaml | 33 + .../targets/eos_ospf_interfaces/tasks/eapi.yaml | 33 + .../targets/eos_ospf_interfaces/tasks/main.yaml | 10 + .../eos_ospf_interfaces/templates/populate.cfg | 16 + .../eos_ospf_interfaces/tests/common/_parsed.cfg | 16 + .../tests/common/_populate.yaml | 5 + .../tests/common/_remove_config.yaml | 8 + .../eos_ospf_interfaces/tests/common/deleted.yaml | 52 + .../tests/common/empty_config.yaml | 61 + .../eos_ospf_interfaces/tests/common/gathered.yaml | 28 + .../tests/common/gathered_empty_config.yml | 27 + .../eos_ospf_interfaces/tests/common/merged.yaml | 66 + .../tests/common/overridden.yaml | 50 + .../eos_ospf_interfaces/tests/common/parsed.yaml | 17 + .../eos_ospf_interfaces/tests/common/rendered.yaml | 46 + .../eos_ospf_interfaces/tests/common/replaced.yaml | 50 + .../eos_ospf_interfaces/tests/common/rtt.yaml | 78 + .../targets/eos_ospf_interfaces/vars/main.yaml | 126 + .../targets/eos_ospfv2/defaults/main.yaml | 3 + .../integration/targets/eos_ospfv2/meta/main.yaml | 3 + .../integration/targets/eos_ospfv2/tasks/cli.yaml | 33 + .../integration/targets/eos_ospfv2/tasks/eapi.yaml | 33 + .../integration/targets/eos_ospfv2/tasks/main.yaml | 10 + .../targets/eos_ospfv2/templates/populate.cfg | 18 + .../targets/eos_ospfv2/tests/common/_parsed.cfg | 16 + .../targets/eos_ospfv2/tests/common/_populate.yaml | 5 + .../eos_ospfv2/tests/common/_remove_config.yaml | 8 + .../targets/eos_ospfv2/tests/common/deleted.yaml | 41 + .../eos_ospfv2/tests/common/empty_config.yaml | 64 + .../targets/eos_ospfv2/tests/common/gathered.yaml | 23 + .../targets/eos_ospfv2/tests/common/merged.yaml | 73 + .../eos_ospfv2/tests/common/overridden.yaml | 51 + .../targets/eos_ospfv2/tests/common/parsed.yaml | 17 + .../targets/eos_ospfv2/tests/common/replaced.yaml | 50 + .../targets/eos_ospfv2/tests/common/rtt.yaml | 99 + .../integration/targets/eos_ospfv2/vars/main.yaml | 318 + .../targets/eos_ospfv3/defaults/main.yaml | 3 + .../integration/targets/eos_ospfv3/meta/main.yaml | 3 + .../integration/targets/eos_ospfv3/tasks/cli.yaml | 33 + .../integration/targets/eos_ospfv3/tasks/eapi.yaml | 33 + .../integration/targets/eos_ospfv3/tasks/main.yaml | 10 + .../targets/eos_ospfv3/templates/populate.cfg | 45 + .../targets/eos_ospfv3/tests/common/_parsed.cfg | 45 + .../targets/eos_ospfv3/tests/common/_populate.yaml | 5 + .../eos_ospfv3/tests/common/_remove_config.yaml | 8 + .../targets/eos_ospfv3/tests/common/deleted.yaml | 41 + .../eos_ospfv3/tests/common/empty_config.yaml | 64 + .../targets/eos_ospfv3/tests/common/gathered.yaml | 23 + .../targets/eos_ospfv3/tests/common/merged.yaml | 181 + .../eos_ospfv3/tests/common/overridden.yaml | 51 + .../targets/eos_ospfv3/tests/common/parsed.yaml | 17 + .../targets/eos_ospfv3/tests/common/rendered.yaml | 99 + .../targets/eos_ospfv3/tests/common/replaced.yaml | 56 + .../targets/eos_ospfv3/tests/common/rtt.yaml | 128 + .../integration/targets/eos_ospfv3/vars/main.yaml | 552 ++ .../targets/eos_prefix_lists/defaults/main.yaml | 3 + .../targets/eos_prefix_lists/meta/main.yaml | 3 + .../targets/eos_prefix_lists/tasks/cli.yaml | 33 + .../targets/eos_prefix_lists/tasks/eapi.yaml | 33 + .../targets/eos_prefix_lists/tasks/main.yaml | 10 + .../eos_prefix_lists/templates/populate.cfg | 7 + .../eos_prefix_lists/tests/common/_parsed.cfg | 7 + .../eos_prefix_lists/tests/common/_populate.yaml | 5 + .../tests/common/_remove_config.yaml | 8 + .../eos_prefix_lists/tests/common/deleted.yaml | 58 + .../tests/common/empty_config.yaml | 60 + .../eos_prefix_lists/tests/common/gathered.yaml | 28 + .../eos_prefix_lists/tests/common/merged.yaml | 63 + .../eos_prefix_lists/tests/common/overridden.yaml | 54 + .../eos_prefix_lists/tests/common/parsed.yaml | 17 + .../eos_prefix_lists/tests/common/rendered.yaml | 44 + .../eos_prefix_lists/tests/common/replaced.yaml | 53 + .../targets/eos_prefix_lists/tests/common/rtt.yaml | 84 + .../targets/eos_prefix_lists/vars/main.yaml | 94 + .../targets/eos_route_maps/defaults/main.yaml | 3 + .../targets/eos_route_maps/meta/main.yaml | 3 + .../targets/eos_route_maps/tasks/cli.yaml | 33 + .../targets/eos_route_maps/tasks/eapi.yaml | 33 + .../targets/eos_route_maps/tasks/main.yaml | 10 + .../targets/eos_route_maps/templates/populate.cfg | 12 + .../eos_route_maps/tests/common/_parsed.cfg | 15 + .../eos_route_maps/tests/common/_populate.yaml | 5 + .../tests/common/_remove_config.yaml | 7 + .../eos_route_maps/tests/common/deleted.yaml | 57 + .../eos_route_maps/tests/common/empty_config.yaml | 60 + .../eos_route_maps/tests/common/gathered.yaml | 28 + .../eos_route_maps/tests/common/merged.yaml | 67 + .../eos_route_maps/tests/common/overridden.yaml | 51 + .../eos_route_maps/tests/common/parsed.yaml | 17 + .../eos_route_maps/tests/common/rendered.yaml | 46 + .../eos_route_maps/tests/common/replaced.yaml | 55 + .../targets/eos_route_maps/tests/common/rtt.yaml | 89 + .../targets/eos_route_maps/vars/main.yaml | 121 + .../targets/eos_smoke/defaults/main.yaml | 2 + .../integration/targets/eos_smoke/meta/main.yml | 3 + .../integration/targets/eos_smoke/tasks/cli.yaml | 26 + .../integration/targets/eos_smoke/tasks/eapi.yaml | 19 + .../integration/targets/eos_smoke/tasks/main.yaml | 10 + .../targets/eos_smoke/tests/cli/caching.yaml | 121 + .../targets/eos_smoke/tests/cli/common_config.yaml | 100 + .../targets/eos_smoke/tests/cli/common_utils.yaml | 60 + .../targets/eos_smoke/tests/cli/misc_tests.yaml | 22 + .../targets/eos_smoke/tests/cli/reboot.yaml | 20 + .../eos_smoke/tests/eapi/common_config.yaml | 100 + .../targets/eos_smoke/tests/eapi/common_utils.yaml | 60 + .../targets/eos_snmp_server/defaults/main.yaml | 3 + .../targets/eos_snmp_server/meta/main.yaml | 3 + .../targets/eos_snmp_server/tasks/cli.yaml | 33 + .../targets/eos_snmp_server/tasks/eapi.yaml | 33 + .../targets/eos_snmp_server/tasks/main.yaml | 10 + .../targets/eos_snmp_server/templates/populate.cfg | 13 + .../eos_snmp_server/tests/common/_parsed.cfg | 13 + .../eos_snmp_server/tests/common/_populate.yaml | 5 + .../tests/common/_remove_config.yaml | 6 + .../eos_snmp_server/tests/common/deleted.yaml | 38 + .../eos_snmp_server/tests/common/empty_config.yaml | 64 + .../eos_snmp_server/tests/common/gathered.yaml | 23 + .../eos_snmp_server/tests/common/merged.yaml | 76 + .../eos_snmp_server/tests/common/overridden.yaml | 54 + .../eos_snmp_server/tests/common/parsed.yaml | 17 + .../eos_snmp_server/tests/common/rendered.yaml | 63 + .../eos_snmp_server/tests/common/replaced.yaml | 53 + .../targets/eos_snmp_server/vars/main.yaml | 113 + .../targets/eos_static_routes/defaults/main.yaml | 3 + .../targets/eos_static_routes/meta/main.yaml | 3 + .../targets/eos_static_routes/tasks/cli.yaml | 33 + .../targets/eos_static_routes/tasks/eapi.yaml | 33 + .../targets/eos_static_routes/tasks/main.yaml | 10 + .../eos_static_routes/tests/common/_parsed.cfg | 7 + .../eos_static_routes/tests/common/_populate.yaml | 15 + .../tests/common/_remove_config.yaml | 30 + .../eos_static_routes/tests/common/deleted.yaml | 163 + .../eos_static_routes/tests/common/gathered.yaml | 82 + .../eos_static_routes/tests/common/merged.yaml | 113 + .../eos_static_routes/tests/common/overridden.yaml | 63 + .../eos_static_routes/tests/common/parsed.yaml | 39 + .../eos_static_routes/tests/common/rendered.yaml | 53 + .../eos_static_routes/tests/common/replaced.yaml | 99 + .../eos_static_routes/tests/common/rtt.yaml | 195 + .../targets/eos_system/defaults/main.yaml | 3 + .../integration/targets/eos_system/meta/main.yml | 3 + .../integration/targets/eos_system/tasks/cli.yaml | 19 + .../integration/targets/eos_system/tasks/eapi.yaml | 19 + .../integration/targets/eos_system/tasks/main.yaml | 10 + .../eos_system/tests/cli/set_domain_list.yaml | 124 + .../eos_system/tests/cli/set_domain_name.yaml | 38 + .../targets/eos_system/tests/cli/set_hostname.yaml | 36 + .../eos_system/tests/cli/set_lookup_source.yaml | 72 + .../eos_system/tests/cli/set_name_servers.yaml | 68 + .../eos_system/tests/eapi/set_domain_list.yaml | 122 + .../eos_system/tests/eapi/set_domain_name.yaml | 36 + .../eos_system/tests/eapi/set_hostname.yaml | 36 + .../eos_system/tests/eapi/set_lookup_source.yaml | 68 + .../eos_system/tests/eapi/set_name_servers.yaml | 64 + .../targets/eos_user/defaults/main.yaml | 2 + .../integration/targets/eos_user/meta/main.yaml | 3 + .../integration/targets/eos_user/tasks/cli.yaml | 19 + .../integration/targets/eos_user/tasks/eapi.yaml | 19 + .../integration/targets/eos_user/tasks/main.yaml | 10 + .../targets/eos_user/tests/cli/auth.yaml | 40 + .../targets/eos_user/tests/cli/basic.yaml | 93 + .../targets/eos_vlans/defaults/main.yaml | 3 + .../integration/targets/eos_vlans/meta/main.yml | 3 + .../integration/targets/eos_vlans/tasks/cli.yaml | 33 + .../integration/targets/eos_vlans/tasks/eapi.yaml | 33 + .../integration/targets/eos_vlans/tasks/main.yaml | 10 + .../targets/eos_vlans/tests/common/_parsed.cfg | 7 + .../eos_vlans/tests/common/_reset_config.yaml | 30 + .../targets/eos_vlans/tests/common/deleted.yaml | 42 + .../eos_vlans/tests/common/empty_config.yaml | 66 + .../targets/eos_vlans/tests/common/gathered.yaml | 23 + .../targets/eos_vlans/tests/common/idempotent.yaml | 24 + .../targets/eos_vlans/tests/common/merged.yaml | 47 + .../targets/eos_vlans/tests/common/overridden.yaml | 44 + .../targets/eos_vlans/tests/common/parsed.yaml | 17 + .../targets/eos_vlans/tests/common/rendered.yaml | 20 + .../targets/eos_vlans/tests/common/replaced.yaml | 45 + .../targets/eos_vlans/tests/common/rtt.yaml | 64 + .../integration/targets/eos_vlans/vars/main.yaml | 15 + .../eos/tests/integration/targets/eos_vrf/aliases | 0 .../integration/targets/eos_vrf/defaults/main.yaml | 3 + .../integration/targets/eos_vrf/meta/main.yml | 3 + .../integration/targets/eos_vrf/tasks/cli.yaml | 19 + .../integration/targets/eos_vrf/tasks/main.yaml | 5 + .../targets/eos_vrf/tests/cli/basic.yaml | 292 + .../targets/prepare_eos_tests/meta/main.yaml | 2 + .../targets/prepare_eos_tests/tasks/main.yml | 29 + .../arista/eos/tests/sanity/ignore-2.10.txt | 13 + .../arista/eos/tests/sanity/ignore-2.11.txt | 13 + .../arista/eos/tests/sanity/ignore-2.12.txt | 13 + .../arista/eos/tests/sanity/ignore-2.13.txt | 1 + .../arista/eos/tests/sanity/ignore-2.14.txt | 1 + .../arista/eos/tests/sanity/ignore-2.15.txt | 1 + .../arista/eos/tests/sanity/ignore-2.16.txt | 1 + .../arista/eos/tests/sanity/ignore-2.9.txt | 17 + .../arista/eos/tests/unit/__init__.py | 0 .../arista/eos/tests/unit/compat/__init__.py | 0 .../arista/eos/tests/unit/compat/mock.py | 129 + .../arista/eos/tests/unit/compat/unittest.py | 41 + .../arista/eos/tests/unit/mock/__init__.py | 0 .../arista/eos/tests/unit/mock/loader.py | 117 + .../arista/eos/tests/unit/mock/path.py | 13 + .../arista/eos/tests/unit/mock/procenv.py | 97 + .../arista/eos/tests/unit/mock/vault_helper.py | 44 + .../arista/eos/tests/unit/mock/yaml_helper.py | 182 + .../arista/eos/tests/unit/modules/__init__.py | 0 .../arista/eos/tests/unit/modules/conftest.py | 41 + .../eos/tests/unit/modules/network/__init__.py | 0 .../eos/tests/unit/modules/network/eos/__init__.py | 0 .../tests/unit/modules/network/eos/eos_module.py | 129 + .../unit/modules/network/eos/fixtures/__init__.py | 0 .../eos/fixtures/eos_acl_interfaces_config.cfg | 6 + .../network/eos/fixtures/eos_acls_config.cfg | 3 + .../eos/fixtures/eos_banner_show_banner.txt | 4 + .../network/eos/fixtures/eos_bgp_af_config.cfg | 23 + .../network/eos/fixtures/eos_bgp_config.cfg | 23 + .../eos/fixtures/eos_bgp_global_af_config.cfg | 25 + .../network/eos/fixtures/eos_bgp_global_config.cfg | 28 + .../eos/fixtures/eos_command_show_version.txt | 13 + .../network/eos/fixtures/eos_config_candidate.cfg | 7 + .../network/eos/fixtures/eos_config_config.cfg | 26 + .../eos/fixtures/eos_config_config_updated.cfg | 26 + .../network/eos/fixtures/eos_eapi_show_mgmt.json | 48 + .../fixtures/eos_eapi_show_mgmt_unconfigured.json | 41 + .../network/eos/fixtures/eos_eapi_show_vrf.text | 8 + .../network/eos/fixtures/eos_hostname_config.cfg | 1 + .../network/eos/fixtures/eos_interfaces_config.cfg | 8 + .../eos/fixtures/eos_l2_interfaces_config.cfg | 12 + .../eos/fixtures/eos_l3_interfaces_config.cfg | 16 + .../network/eos/fixtures/eos_lacp_config.cfg | 1 + .../eos/fixtures/eos_lacp_interfaces_config.cfg | 4 + .../eos/fixtures/eos_lag_interfaces_config.cfg | 4 + .../eos/fixtures/eos_lldp_global_config.cfg | 5 + .../network/eos/fixtures/eos_logging_config.cfg | 6 + .../eos/fixtures/eos_logging_global_config.cfg | 15 + .../network/eos/fixtures/eos_ntp_global_config.cfg | 10 + .../eos/fixtures/eos_ospf_interfaces_config.cfg | 20 + .../network/eos/fixtures/eos_ospfv2_config.cfg | 19 + .../eos/fixtures/eos_ospfv2_config_gather.cfg | 15 + .../network/eos/fixtures/eos_ospfv3_config.cfg | 45 + .../eos/fixtures/eos_ospfv3_config_gather.cfg | 11 + .../eos/fixtures/eos_prefix_lists_config.cfg | 9 + .../network/eos/fixtures/eos_route_maps_config.cfg | 15 + .../eos/fixtures/eos_snmp_server_config.cfg | 13 + .../eos/fixtures/eos_static_routes_config.cfg | 3 + .../eos/fixtures/eos_static_routes_config1.cfg | 1 + .../network/eos/fixtures/eos_system_config.cfg | 12 + .../network/eos/fixtures/eos_user_config.cfg | 2 + .../network/eos/fixtures/eos_vlan_config.cfg | 6 + .../modules/network/eos/test_eos_acl_interfaces.py | 424 + .../unit/modules/network/eos/test_eos_acls.py | 442 + .../unit/modules/network/eos/test_eos_banner.py | 103 + .../tests/unit/modules/network/eos/test_eos_bgp.py | 400 + .../network/eos/test_eos_bgp_address_family.py | 508 ++ .../modules/network/eos/test_eos_bgp_global.py | 857 ++ .../unit/modules/network/eos/test_eos_command.py | 143 + .../unit/modules/network/eos/test_eos_config.py | 284 + .../unit/modules/network/eos/test_eos_eapi.py | 192 + .../unit/modules/network/eos/test_eos_hostname.py | 110 + .../modules/network/eos/test_eos_interfaces.py | 253 + .../modules/network/eos/test_eos_l2_interfaces.py | 226 + .../modules/network/eos/test_eos_l3_interfaces.py | 336 + .../unit/modules/network/eos/test_eos_lacp.py | 112 + .../network/eos/test_eos_lacp_interfaces.py | 173 + .../modules/network/eos/test_eos_lag_interfaces.py | 293 + .../modules/network/eos/test_eos_lldp_global.py | 224 + .../unit/modules/network/eos/test_eos_logging.py | 114 + .../modules/network/eos/test_eos_logging_global.py | 437 + .../modules/network/eos/test_eos_ntp_global.py | 580 ++ .../network/eos/test_eos_ospf_interfaces.py | 638 ++ .../unit/modules/network/eos/test_eos_ospfv2.py | 850 ++ .../unit/modules/network/eos/test_eos_ospfv3.py | 864 ++ .../modules/network/eos/test_eos_prefix_lists.py | 602 ++ .../modules/network/eos/test_eos_route_maps.py | 507 ++ .../modules/network/eos/test_eos_snmp_server.py | 685 ++ .../modules/network/eos/test_eos_static_routes.py | 447 + .../unit/modules/network/eos/test_eos_system.py | 128 + .../unit/modules/network/eos/test_eos_user.py | 145 + .../unit/modules/network/eos/test_eos_vlans.py | 170 + .../arista/eos/tests/unit/modules/utils.py | 55 + .../arista/eos/tests/unit/requirements.txt | 42 + ansible_collections/arista/eos/tox.ini | 32 + 992 files changed, 148621 insertions(+) create mode 100644 ansible_collections/arista/eos/.github/workflows/tests.yml create mode 100644 ansible_collections/arista/eos/.gitignore create mode 100644 ansible_collections/arista/eos/.isort.cfg create mode 100644 ansible_collections/arista/eos/.pre-commit-config.yaml create mode 100644 ansible_collections/arista/eos/.prettierignore create mode 100644 ansible_collections/arista/eos/.yamllint create mode 100644 ansible_collections/arista/eos/CHANGELOG.rst create mode 100644 ansible_collections/arista/eos/FILES.json create mode 100644 ansible_collections/arista/eos/LICENSE create mode 100644 ansible_collections/arista/eos/MANIFEST.json create mode 100644 ansible_collections/arista/eos/README.md create mode 100644 ansible_collections/arista/eos/bindep.txt create mode 100644 ansible_collections/arista/eos/changelogs/changelog.yaml create mode 100644 ansible_collections/arista/eos/changelogs/config.yaml create mode 100644 ansible_collections/arista/eos/changelogs/fragments/.keep create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_acl_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_acls_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_banner_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_bgp_address_family_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_bgp_global_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_bgp_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_cliconf.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_command_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_config_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_eapi_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_facts_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_hostname_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_httpapi.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_l2_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_l3_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_lacp_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_lacp_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_lag_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_lldp_global_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_lldp_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_lldp_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_logging_global_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_logging_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_ntp_global_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_ospf_interfaces_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_ospfv2_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_ospfv3_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_prefix_lists_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_route_maps_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_snmp_server_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_static_routes_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_system_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_user_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_vlans_module.rst create mode 100644 ansible_collections/arista/eos/docs/arista.eos.eos_vrf_module.rst create mode 100644 ansible_collections/arista/eos/ignore-2.9.txt create mode 100644 ansible_collections/arista/eos/meta/runtime.yml create mode 100644 ansible_collections/arista/eos/plugins/action/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/action/acl_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/acls.py create mode 100644 ansible_collections/arista/eos/plugins/action/banner.py create mode 100644 ansible_collections/arista/eos/plugins/action/bgp.py create mode 100644 ansible_collections/arista/eos/plugins/action/bgp_address_family.py create mode 100644 ansible_collections/arista/eos/plugins/action/bgp_global.py create mode 100644 ansible_collections/arista/eos/plugins/action/command.py create mode 100644 ansible_collections/arista/eos/plugins/action/config.py create mode 100644 ansible_collections/arista/eos/plugins/action/eapi.py create mode 100644 ansible_collections/arista/eos/plugins/action/eos.py create mode 100644 ansible_collections/arista/eos/plugins/action/facts.py create mode 100644 ansible_collections/arista/eos/plugins/action/hostname.py create mode 100644 ansible_collections/arista/eos/plugins/action/interface.py create mode 100644 ansible_collections/arista/eos/plugins/action/interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/l2_interface.py create mode 100644 ansible_collections/arista/eos/plugins/action/l2_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/l3_interface.py create mode 100644 ansible_collections/arista/eos/plugins/action/l3_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/lacp.py create mode 100644 ansible_collections/arista/eos/plugins/action/lacp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/lag_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/linkagg.py create mode 100644 ansible_collections/arista/eos/plugins/action/lldp.py create mode 100644 ansible_collections/arista/eos/plugins/action/lldp_global.py create mode 100644 ansible_collections/arista/eos/plugins/action/lldp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/logging.py create mode 100644 ansible_collections/arista/eos/plugins/action/logging_global.py create mode 100644 ansible_collections/arista/eos/plugins/action/ntp_global.py create mode 100644 ansible_collections/arista/eos/plugins/action/ospf_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/action/ospfv2.py create mode 100644 ansible_collections/arista/eos/plugins/action/ospfv3.py create mode 100644 ansible_collections/arista/eos/plugins/action/prefix_lists.py create mode 100644 ansible_collections/arista/eos/plugins/action/route_maps.py create mode 100644 ansible_collections/arista/eos/plugins/action/snmp_server.py create mode 100644 ansible_collections/arista/eos/plugins/action/static_route.py create mode 100644 ansible_collections/arista/eos/plugins/action/static_routes.py create mode 100644 ansible_collections/arista/eos/plugins/action/system.py create mode 100644 ansible_collections/arista/eos/plugins/action/user.py create mode 100644 ansible_collections/arista/eos/plugins/action/vlan.py create mode 100644 ansible_collections/arista/eos/plugins/action/vlans.py create mode 100644 ansible_collections/arista/eos/plugins/action/vrf.py create mode 100644 ansible_collections/arista/eos/plugins/cliconf/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/cliconf/eos.py create mode 100644 ansible_collections/arista/eos/plugins/filter/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/httpapi/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/httpapi/eos.py create mode 100644 ansible_collections/arista/eos/plugins/inventory/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acl_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acl_interfaces/acl_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acls/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acls/acls.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_address_family/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_address_family/bgp_address_family.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_global/bgp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/facts/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/facts/facts.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/hostname/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/hostname/hostname.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/interfaces/interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l2_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l2_interfaces/l2_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l3_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l3_interfaces/l3_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp/lacp.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp_interfaces/lacp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lag_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lag_interfaces/lag_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_global/lldp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_interfaces/lldp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/logging_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/logging_global/logging_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ntp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ntp_global/ntp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospf_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospf_interfaces/ospf_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv2/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv2/ospfv2.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv3/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv3/ospfv3.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/prefix_lists/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/prefix_lists/prefix_lists.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/route_maps/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/route_maps/route_maps.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/snmp_server/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/snmp_server/snmp_server.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/static_routes/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/static_routes/static_routes.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/vlans/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/vlans/vlans.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acl_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acl_interfaces/acl_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acls/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acls/acls.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_address_family/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_address_family/bgp_address_family.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_global/bgp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/hostname/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/hostname/hostname.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/interfaces/interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l2_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l2_interfaces/l2_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l3_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l3_interfaces/l3_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp/lacp.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp_interfaces/lacp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lag_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lag_interfaces/lag_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_global/lldp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_interfaces/lldp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/logging_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/logging_global/logging_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ntp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ntp_global/ntp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospf_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospf_interfaces/ospf_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv2/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv2/ospfv2.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv3/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv3/ospfv3.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/prefix_lists/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/prefix_lists/prefix_lists.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/route_maps/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/route_maps/route_maps.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/snmp_server/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/snmp_server/snmp_server.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/static_routes/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/static_routes/static_routes.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/vlans/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/config/vlans/vlans.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/eos.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acl_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acl_interfaces/acl_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acls/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acls/acls.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_address_family/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_address_family/bgp_address_family.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_global/bgp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/facts.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/hostname/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/hostname/hostname.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/interfaces/interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l2_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l2_interfaces/l2_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l3_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l3_interfaces/l3_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp/lacp.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp_interfaces/lacp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lag_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lag_interfaces/lag_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/legacy/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/legacy/base.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_global/lldp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_interfaces/lldp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/logging_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/logging_global/logging_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ntp_global/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ntp_global/ntp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospf_interfaces/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospf_interfaces/ospf_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv2/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv2/ospfv2.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv3/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv3/ospfv3.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/prefix_lists/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/prefix_lists/prefix_lists.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/route_maps/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/route_maps/route_maps.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/snmp_server/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/snmp_server/snmp_server.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/static_routes/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/static_routes/static_routes.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/vlans/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/vlans/vlans.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/address_family.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/neighbors.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/process.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/module.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/providers.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_address_family.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/hostname.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/logging_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/ntp_global.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/ospf_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/ospfv3.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/prefix_lists.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/route_maps.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/snmp_server.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/utils/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/module_utils/network/eos/utils/utils.py create mode 100644 ansible_collections/arista/eos/plugins/modules/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_acl_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_acls.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_banner.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_bgp.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_bgp_address_family.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_bgp_global.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_command.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_config.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_eapi.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_facts.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_hostname.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_l2_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_l3_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_lacp.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_lacp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_lag_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_lldp.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_lldp_global.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_lldp_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_logging.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_logging_global.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_ntp_global.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_ospf_interfaces.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_ospfv2.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_ospfv3.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_prefix_lists.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_route_maps.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_snmp_server.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_static_routes.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_system.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_user.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_vlans.py create mode 100644 ansible_collections/arista/eos/plugins/modules/eos_vrf.py create mode 100644 ansible_collections/arista/eos/plugins/terminal/__init__.py create mode 100644 ansible_collections/arista/eos/plugins/terminal/eos.py create mode 100644 ansible_collections/arista/eos/pyproject.toml create mode 100644 ansible_collections/arista/eos/requirements.txt create mode 100644 ansible_collections/arista/eos/test-requirements.txt create mode 100644 ansible_collections/arista/eos/tests/.gitignore create mode 100644 ansible_collections/arista/eos/tests/integration/network-integration.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/target-prefixes.network create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acl_interfaces/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/_parsed_cfg.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_acls/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/tests/cli/basic-login.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/tests/cli/basic-motd.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/tests/eapi/basic-login.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_banner/tests/eapi/basic-motd.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp/tests/cli/basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tasks/redirection.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/_redirection.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_address_family/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/templates/populate_af.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/_populate_af.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/purged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_bgp_global/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/bad_operator.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/cli_command.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/contains.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/equal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/greaterthan.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/greaterthanorequal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/invalid.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/lessthan.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/lessthanorequal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/notequal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/output.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/timeout.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/cli/version.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/bad_operator.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/contains.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/equal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/greaterthan.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/greaterthanorequal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/invalid.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/lessthan.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/lessthanorequal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/notequal.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/output.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/timeout.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_command/tests/eapi/version.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/config.txt create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tasks/cli_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tasks/redirection.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/templates/basic/cmds.j2 create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/templates/basic/config.j2 create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/templates/defaults/config.j2 create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/templates/defaults/test.j2 create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/backup.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/check_mode.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/defaults.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/diff_against_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/save.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/src_basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/src_invalid.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/src_match_none.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/sublevel.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/sublevel_block.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/sublevel_exact.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/sublevel_strict.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/sublevel_strict_mul_parents.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/toplevel.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/toplevel_after.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli/toplevel_before.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli_config/cli_backup.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/cli_config/cli_basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/backup.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/defaults.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/save.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/src_basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/src_invalid.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/src_match_none.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/sublevel.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/sublevel_block.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/sublevel_exact.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/sublevel_strict.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/toplevel.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/toplevel_after.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/eapi/toplevel_before.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_config/tests/redirection/cli/shortname.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/badtransport.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/configure.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/off.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/on.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/start.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/stop.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/vrf.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_eapi/tests/cli/zzz_reset.1 create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/cli/all_facts.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/cli/default_facts.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/cli/invalid_subset.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/cli/not_hardware.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/eapi/all_facts.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/eapi/default_facts.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/eapi/invalid_subset.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_facts/tests/eapi/not_hardware.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_hostname/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/templates/reset.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_interfaces/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/_cleanup.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l2_interfaces/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/templates/reset.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_l3_interfaces/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lacp_interfaces/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/tests/cli/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lag_interfaces/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp/tests/cli/basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp/tests/eapi/basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_global/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_lldp_interfaces/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging/tests/cli/basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging/tests/eapi/basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_logging_global/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ntp_global/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/gathered_empty_config.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospf_interfaces/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv2/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_ospfv3/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_prefix_lists/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_route_maps/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tests/cli/caching.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tests/cli/common_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tests/cli/common_utils.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tests/cli/misc_tests.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tests/cli/reboot.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tests/eapi/common_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_smoke/tests/eapi/common_utils.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/templates/populate.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_snmp_server/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/_populate.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/_remove_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_static_routes/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/cli/set_domain_list.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/cli/set_domain_name.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/cli/set_hostname.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/cli/set_lookup_source.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/cli/set_name_servers.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/eapi/set_domain_list.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/eapi/set_domain_name.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/eapi/set_hostname.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/eapi/set_lookup_source.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_system/tests/eapi/set_name_servers.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_user/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_user/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_user/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_user/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_user/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_user/tests/cli/auth.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_user/tests/cli/basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tasks/eapi.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/_parsed.cfg create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/_reset_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/deleted.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/empty_config.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/gathered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/idempotent.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/merged.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/overridden.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/parsed.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/rendered.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/replaced.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/tests/common/rtt.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vlans/vars/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vrf/aliases create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vrf/defaults/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vrf/meta/main.yml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vrf/tasks/cli.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vrf/tasks/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/eos_vrf/tests/cli/basic.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/prepare_eos_tests/meta/main.yaml create mode 100644 ansible_collections/arista/eos/tests/integration/targets/prepare_eos_tests/tasks/main.yml create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.10.txt create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.11.txt create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.12.txt create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.13.txt create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.14.txt create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.15.txt create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.16.txt create mode 100644 ansible_collections/arista/eos/tests/sanity/ignore-2.9.txt create mode 100644 ansible_collections/arista/eos/tests/unit/__init__.py create mode 100644 ansible_collections/arista/eos/tests/unit/compat/__init__.py create mode 100644 ansible_collections/arista/eos/tests/unit/compat/mock.py create mode 100644 ansible_collections/arista/eos/tests/unit/compat/unittest.py create mode 100644 ansible_collections/arista/eos/tests/unit/mock/__init__.py create mode 100644 ansible_collections/arista/eos/tests/unit/mock/loader.py create mode 100644 ansible_collections/arista/eos/tests/unit/mock/path.py create mode 100644 ansible_collections/arista/eos/tests/unit/mock/procenv.py create mode 100644 ansible_collections/arista/eos/tests/unit/mock/vault_helper.py create mode 100644 ansible_collections/arista/eos/tests/unit/mock/yaml_helper.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/__init__.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/conftest.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/__init__.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/__init__.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/eos_module.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/__init__.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_acl_interfaces_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_acls_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_banner_show_banner.txt create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_bgp_af_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_bgp_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_bgp_global_af_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_bgp_global_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_command_show_version.txt create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_config_candidate.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_config_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_config_config_updated.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_eapi_show_mgmt.json create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_eapi_show_mgmt_unconfigured.json create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_eapi_show_vrf.text create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_hostname_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_interfaces_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_l2_interfaces_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_l3_interfaces_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_lacp_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_lacp_interfaces_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_lag_interfaces_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_lldp_global_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_logging_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_logging_global_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_ntp_global_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_ospf_interfaces_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_ospfv2_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_ospfv2_config_gather.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_ospfv3_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_ospfv3_config_gather.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_prefix_lists_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_route_maps_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_snmp_server_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_static_routes_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_static_routes_config1.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_system_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_user_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/fixtures/eos_vlan_config.cfg create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_acl_interfaces.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_acls.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_banner.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_bgp.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_bgp_address_family.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_bgp_global.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_command.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_config.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_eapi.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_hostname.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_interfaces.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_l2_interfaces.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_l3_interfaces.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_lacp.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_lacp_interfaces.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_lag_interfaces.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_lldp_global.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_logging.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_logging_global.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_ntp_global.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_ospf_interfaces.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_ospfv2.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_ospfv3.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_prefix_lists.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_route_maps.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_snmp_server.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_static_routes.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_system.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_user.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/network/eos/test_eos_vlans.py create mode 100644 ansible_collections/arista/eos/tests/unit/modules/utils.py create mode 100644 ansible_collections/arista/eos/tests/unit/requirements.txt create mode 100644 ansible_collections/arista/eos/tox.ini (limited to 'ansible_collections/arista') diff --git a/ansible_collections/arista/eos/.github/workflows/tests.yml b/ansible_collections/arista/eos/.github/workflows/tests.yml new file mode 100644 index 000000000..e77967b34 --- /dev/null +++ b/ansible_collections/arista/eos/.github/workflows/tests.yml @@ -0,0 +1,45 @@ +--- +name: Test collection + +concurrency: + group: ${{ github.head_ref }} + cancel-in-progress: true + +on: # yamllint disable-line rule:truthy + pull_request: + branches: [main] + workflow_dispatch: + +jobs: + ansible-lint: + uses: ansible-network/github_actions/.github/workflows/ansible-lint.yml@main + changelog: + uses: ansible-network/github_actions/.github/workflows/changelog.yml@main + sanity: + uses: ansible-network/github_actions/.github/workflows/sanity.yml@main + unit-galaxy: + uses: ansible-network/github_actions/.github/workflows/unit_galaxy.yml@main + unit-source: + uses: ansible-network/github_actions/.github/workflows/unit_source.yml@main + with: + collection_pre_install: >- + git+https://github.com/ansible-collections/ansible.utils.git + git+https://github.com/ansible-collections/ansible.netcommon.git + all_green: + if: ${{ always() }} + needs: + - ansible-lint + - changelog + - sanity + - unit-galaxy + - unit-source + runs-on: ubuntu-latest + steps: + - run: >- + python -c "assert set([ + '${{ needs.ansible-lint.result }}', + '${{ needs.changelog.result }}', + '${{ needs.sanity.result }}', + '${{ needs.unit-galaxy.result }}', + '${{ needs.unit-source.result }}' + ]) == {'success'}" diff --git a/ansible_collections/arista/eos/.gitignore b/ansible_collections/arista/eos/.gitignore new file mode 100644 index 000000000..894a44cc0 --- /dev/null +++ b/ansible_collections/arista/eos/.gitignore @@ -0,0 +1,104 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ diff --git a/ansible_collections/arista/eos/.isort.cfg b/ansible_collections/arista/eos/.isort.cfg new file mode 100644 index 000000000..e6ede211a --- /dev/null +++ b/ansible_collections/arista/eos/.isort.cfg @@ -0,0 +1,6 @@ +[settings] +known_first_party=ansible_collections.arista.eos +line_length=100 +lines_after_imports=2 +lines_between_types=1 +profile=black diff --git a/ansible_collections/arista/eos/.pre-commit-config.yaml b/ansible_collections/arista/eos/.pre-commit-config.yaml new file mode 100644 index 000000000..89fa9a674 --- /dev/null +++ b/ansible_collections/arista/eos/.pre-commit-config.yaml @@ -0,0 +1,58 @@ +--- +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: check-merge-conflict + - id: check-symlinks + - id: debug-statements + - id: end-of-file-fixer + - id: no-commit-to-branch + args: [--branch, main] + - id: trailing-whitespace + + - repo: https://github.com/asottile/add-trailing-comma + rev: v2.4.0 + hooks: + - id: add-trailing-comma + + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v3.0.0-alpha.4" + hooks: + - id: prettier + # Original hook implementation is flaky due to *several* bugs described + # in https://github.com/prettier/prettier/issues/12364 + # a) CI=1 needed to avoid incomplete output + # b) two executions are needed because --list-different works correctly + # only when run with --check as with --write the output will also + # include other entries and logging level cannot be used to keep only + # modified files listed (any file is listed using the log level, regardless if + # is modified or not). + # c) We avoid letting pre-commit pass each filename in order to avoid + # running multiple instances in parallel. This also ensures that running + # prettier from the command line behaves identically with the pre-commit + # one. No real performance downsides. + # d) exit with the return code from list-different (0=none, 1=some) + # rather than the write (0=successfully rewrote files). pre-commit.ci + entry: env CI=1 bash -c "prettier --list-different . || ec=$? && prettier --loglevel=error --write . && exit $ec" + pass_filenames: false + args: [] + additional_dependencies: + - prettier + - prettier-plugin-toml + + - repo: https://github.com/PyCQA/isort + rev: 5.12.0 + hooks: + - id: isort + name: Sort import statements using isort + + - repo: https://github.com/psf/black + rev: 23.1.0 + hooks: + - id: black + + - repo: https://github.com/ansible-network/collection_prep + rev: 1.1.0 + hooks: + - id: update-docs diff --git a/ansible_collections/arista/eos/.prettierignore b/ansible_collections/arista/eos/.prettierignore new file mode 100644 index 000000000..77a30abd4 --- /dev/null +++ b/ansible_collections/arista/eos/.prettierignore @@ -0,0 +1,23 @@ +# Stuff we don't want priettier to ever to look into +.*/ + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# A linked collection directory created by pytest-ansible-units + +collections/ + +# Tracked but not manually edited + +# Tracked but manually formatted + +# WIP +tests/integration/targets/eos_config/templates/config.js +README.md diff --git a/ansible_collections/arista/eos/.yamllint b/ansible_collections/arista/eos/.yamllint new file mode 100644 index 000000000..3adaf90cf --- /dev/null +++ b/ansible_collections/arista/eos/.yamllint @@ -0,0 +1,15 @@ +--- +extends: default + +ignore: | + .tox + changelogs/* + +rules: + braces: + max-spaces-inside: 1 + level: error + brackets: + max-spaces-inside: 1 + level: error + line-length: disable diff --git a/ansible_collections/arista/eos/CHANGELOG.rst b/ansible_collections/arista/eos/CHANGELOG.rst new file mode 100644 index 000000000..71d46465a --- /dev/null +++ b/ansible_collections/arista/eos/CHANGELOG.rst @@ -0,0 +1,403 @@ +=================================== +Arista Eos Collection Release Notes +=================================== + +.. contents:: Topics + + +v6.0.1 +====== + +Bugfixes +-------- + +- fix ntp_global authenticate config. +- https://github.com/ansible-collections/arista.eos/issues/399. + +v6.0.0 +====== + +Major Changes +------------- + +- Remove following EOS dprecated modules +- Use of connection: local and the provider option are no longer valid on any modules in this collection. +- eos_interface +- eos_l2_interface +- eos_l3_interface +- eos_linkagg +- eos_static_route +- eos_vlan + +Minor Changes +------------- + +- Add support for setting encryption_password for BGP neighbors in bgp_global module +- Add validate_config option to diff_against in eos_config + +v5.0.1 +====== + +Bugfixes +-------- + +- Add logic to add new interface using overridden. +- Automatiaclly named sessions (ansible_XXXXXXXXX) now use two digits of sub-second precision (if available). This is to work around tasks reusing a session if the previous task completed very quickly. +- Fix the logic to add new aces using replaced and overriden state. +- Normalize interface name from want before comaparing with the interface in have. +- Normalize ntp server source interface. + +v5.0.0 +====== + +Major Changes +------------- + +- Minimum required ansible.netcommon version is 2.5.1. +- Updated base plugin references to ansible.netcommon. +- `eos_facts` - change default gather_subset to `min` from `!config` (https://github.com/ansible-collections/arista.eos/issues/306). + +Breaking Changes / Porting Guide +-------------------------------- + +- httpapi - the ``eos_use_sessions`` option is now a boolean instead of an integer. + +Bugfixes +-------- + +- Add and fix bgp_global neighbor parsers. +- Fix added to change snmp communities with or without acl. +- Fix parser to parse maximum-paths ecmp command correctly. +- arista.eos.eos_acls - fixed issue that would cause a key value error on `aces` element when no ACEs exist in the access-list. +- arista.eos.eos_acls - fixed issue where protcol_options were rendered to command line using the key _underscore_ value rather than the hyphen nominclature. +- httpapi - detect session support more robustly when ``eos_use_sessions`` is not specified. + +v4.1.2 +====== + +Bugfixes +-------- + +- Add symlink of modules under plugins/action. +- eos_bgp_global - Add alias for peer - neighbor_address + +v4.1.1 +====== + +Bugfixes +-------- + +- Add check mode support to bgp_global and bgp_address_family +- Add logic to skip unwanted configs from running-config, to collect bgp af facts. +- Fixed an invalid parameter used in example for eos_l2_interfaces + +v4.1.0 +====== + +Minor Changes +------------- + +- Add eos_hostname resource module. +- eos_acls - Fix examples typos + +Bugfixes +-------- + +- eos_acls - fixes state replaced where new ACEs are not all added + +New Modules +----------- + +- eos_hostname - Manages hostname resource module + +v4.0.0 +====== + +Minor Changes +------------- + +- Add eos_snmp_server resource module. + +Breaking Changes / Porting Guide +-------------------------------- + +- eos_command - new suboption ``version`` of parameter ``command``, which controls the JSON response version. Previously the value was assumed to be "latest" for network_cli and "1" for httpapi, but the default will now be "latest" for both connections. This option is also available for use in modules making their own device requests with ``plugins.module_utils.network.eos.eos.run_commands()`` with the same new default behavior. (https://github.com/ansible-collections/arista.eos/pull/258). + +New Modules +----------- + +- eos_snmp_server - Manages snmp_server resource module + +v3.1.0 +====== + +Minor Changes +------------- + +- Add eos_ntp_global module. + +Deprecated Features +------------------- + +- Remove testing with provider for ansible-test integration jobs. This helps prepare us to move to network-ee integration tests. + +Bugfixes +-------- + +- Changed access_group parameter to type list, to enable multiple access-groups configuration. +- Fix logic error while executing replaced and overridden operations on bgp neighbors. +- Fix typo and logic errors in bgp_global, to skip other routing protocol configs from running-config. +- command template fixed supporting Jinja version for centos-8 EEs. + +New Modules +----------- + +- eos_ntp_global - Manages ntp resource module + +v3.0.0 +====== + +Minor Changes +------------- + +- Add eos_logging_global resource module. +- Add new keys to vrf->route_target in bgp modules. +- Change cli 'bgp listen limit' to 'dynamic peer max' ( cli changes in eos 4.23 ). +- Fix ospf3 to be ospfv3 in bgp config. +- Update BGP neighbor peer group syntax. + +Breaking Changes / Porting Guide +-------------------------------- + +- Arista released train 4.23.X and newer and along with it replaced and deprecated lots of commands. This PR adds support for syntax changes in release train 4.23 and after. Going forward the eos modules will not support eos sw version < 4.23. + +Bugfixes +-------- + +- Added fix to support multiple keys under ip and ipv6 dict in parser template. +- fix issue in prefix_lists facts code when prefix_lists facts are empty. +- fix issue in route-maps facts code when route-maps facts are empty. + +New Modules +----------- + +- eos_logging_global - Manages logging resource module + +v2.2.0 +====== + +Minor Changes +------------- + +- Add eos_prefix_lists resource module. + +Bugfixes +-------- + +- Add alias to neighbor and network in bgp_global so that lists of objects are plural. +- Fix typo in eos_bgp_address_family redirection. + +New Modules +----------- + +- eos_prefix_lists - Manages Prefix lists resource module + +v2.1.2 +====== + +Bugfixes +-------- + +- Add support to accomodate change in username config cli in latest eos software version. +- Fix regex for password prompt. +- argspec key 'shut_down' changed to 'shutdown'. + +v2.1.1 +====== + +Minor Changes +------------- + +- Add eos_route_maps resource module. +- Add support for available_network_resources key, which allows to fetch the available resources for a platform (https://github.com/ansible-collections/arista.eos/issues/184). + +Security Fixes +-------------- + +- Mask values of sensitive keys in module result. + +Bugfixes +-------- + +- Modify the split pattern while checking for eapi url in eos_eapi. +- Normalize interface name before any operaion. +- Skip when there are alpha values present following vlan keyword. + +v2.0.1 +====== + +Bugfixes +-------- + +- Add _remove_config before starting every integration test. +- galaxy.yml - change wrong dependency ``ansible.netcommon`` from ``2.0.0`` to ``>= 2.0.0`` (https://github.com/ansible-collections/overview/issues/43). + +v2.0.0 +====== + +Major Changes +------------- + +- Requires ansible.netcommon v2.0.0+ to support `ansible_network_single_user_mode` and `ansible_network_import_modules` - Please refer to ansible.netcommon `changelog `_ for more details. + +Minor Changes +------------- + +- Add support for configuration caching (single_user_mode). +- Add support for syntax changes in ospf bfd command in 4.23 (https://github.com/ansible-collections/arista.eos/pull/134/) +- Move eos_config idempotent warning message with the task response under `warnings` key if `changed` is `True` +- Re-use device_info dictionary in cliconf + +Bugfixes +-------- + +- Add 'virtual' key to denote the existence of virtual address on an interface.(https://github.com/ansible-collections/arista.eos/pull/170). +- Fixed the regex to parse the running config correctly.(https://github.com/ansible-collections/arista.eos/issues/150) +- cliconf plugin - Prevent `get_capabilities()` from getting larger every time it is called + +v1.3.0 +====== + +Bugfixes +-------- + +- Add version key to galaxy.yaml to work around ansible-galaxy bug +- Fix yaml formatting errors in documentation. +- Uncap required ansible version in our collection. +- Update default values in module argspec and docs (https://github.com/ansible-collections/arista.eos/pull/154). +- Update docs to clarify the idemptonecy releated caveat and add it in the output warnings (https://github.com/ansible-collections/ansible.netcommon/pull/189) +- fixes eos interfaces rm where interface in description resulted in failure (https://github.com/ansible-collections/arista.eos/issues/86). +- replace list.copy() with list[:] to support python 2.7 and fix idempotent issue with replaced and overridden (https://github.com/ansible-collections/arista.eos/pull/142). + +New Modules +----------- + +- eos_bgp_address_family - Manages BGP address family resource module +- eos_bgp_global - Manages BGP global resource module + +v1.2.0 +====== + +Minor Changes +------------- + +- Added ospf_interfaces resource module. (https://github.com/ansible-collections/arista.eos/pull/125) +- Documented the necessity to use eos_interfaces and eos_l2_interfaces (for l2 configs) in eos_l3_interfaces module. +- modify short description in ospfv3 resource module. +- stop integration testing of local connection as it is deprecated. + +Bugfixes +-------- + +- updated config dict, with duplex key when speed changes from 'x' to 'forced x' (https://github.com/ansible-collections/arista.eos/pull/120). + +New Modules +----------- + +- eos_ospf_interfaces - OSPF Interfaces Resource Module. + +v1.1.0 +====== + +Minor Changes +------------- + +- Added 'mode' to examples in documentation of eos_l2_interfaces. +- Added eos ospfv3 resource module (https://github.com/ansible-collections/arista.eos/pull/109). +- Added unit test cases for eos_lldp_global module. + +Bugfixes +-------- + +- Added 'mode' key to eos_interfaces to handle the layer2/3 switchport mode of an interface. +- Added fix to maintain the idempotency while using overridden operation. +- Check for existing configuration when trunk_allowed_vlans is issued, is added. +- Fixed typo and index out of range errors while handling protocol_options. (https://github.com/ansible-collections/arista.eos/pull/115) + +New Modules +----------- + +- eos_ospfv3 - OSPFv3 resource module + +v1.0.3 +====== + +Bugfixes +-------- + +- Added error pattern to the terminal plugin to handle change mode error seen in lag interfaces config. + +v1.0.2 +====== + +v1.0.1 +====== + +Minor Changes +------------- + +- Add round trip testcases to the 2.9 resource modules. +- Add unit testcases to the eos_l3_interfaces resource modules. +- Add unit testcases to the eos_lag_interfaces resource modules. +- Sorted the list of params of ip address before forming the tuple. +- Updated docs. + +Bugfixes +-------- + +- Fixes mismatch in documentation and code for using eos_lag_interfaces where the code required 'Port-Channel\d.*:' but the docs did not document this. The module now supports both 'Port-Channel\d.*:' and '\d.*:'. +- Make `src`, `backup` and `backup_options` in eos_config work when module alias is used (https://github.com/ansible-collections/arista.eos/pull/85). + +v1.0.0 +====== + +New Plugins +----------- + +Cliconf +~~~~~~~ + +- eos - Use eos cliconf to run command on Arista EOS platform + +Httpapi +~~~~~~~ + +- eos - Use eAPI to run command on eos platform + +New Modules +----------- + +- eos_acl_interfaces - ACL interfaces resource module +- eos_acls - ACLs resource module +- eos_banner - Manage multiline banners on Arista EOS devices +- eos_bgp - (deprecated, removed after 2023-01-29) Configure global BGP protocol settings on Arista EOS. +- eos_command - Run arbitrary commands on an Arista EOS device +- eos_config - Manage Arista EOS configuration sections +- eos_eapi - Manage and configure Arista EOS eAPI. +- eos_facts - Collect facts from remote devices running Arista EOS +- eos_interfaces - Interfaces resource module +- eos_l2_interfaces - L2 interfaces resource module +- eos_l3_interfaces - L3 interfaces resource module +- eos_lacp - LACP resource module +- eos_lacp_interfaces - LACP interfaces resource module +- eos_lag_interfaces - LAG interfaces resource module +- eos_lldp - Manage LLDP configuration on Arista EOS network devices +- eos_lldp_global - LLDP resource module +- eos_lldp_interfaces - LLDP interfaces resource module +- eos_logging - Manage logging on network devices +- eos_ospfv2 - OSPFv2 resource module +- eos_static_routes - Static routes resource module +- eos_system - Manage the system attributes on Arista EOS devices +- eos_user - Manage the collection of local users on EOS devices +- eos_vlans - VLANs resource module +- eos_vrf - Manage VRFs on Arista EOS network devices diff --git a/ansible_collections/arista/eos/FILES.json b/ansible_collections/arista/eos/FILES.json new file mode 100644 index 000000000..1c30ea86e --- /dev/null +++ b/ansible_collections/arista/eos/FILES.json @@ -0,0 +1,9511 @@ +{ + "files": [ + { + "name": ".", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": ".github", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": ".github/workflows", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": ".github/workflows/tests.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb6838827012c333b7aa2b445987ce5aef5727b640e7647846d09e30d32b54b6", + "format": 1 + }, + { + "name": "changelogs", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "changelogs/fragments", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "changelogs/fragments/.keep", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "changelogs/changelog.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7e071dc377ff2a9d39db51e997485a5230aa549fc490bd4b810586f06a529631", + "format": 1 + }, + { + "name": "changelogs/config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aa1b22e6fd4e93f7afc36ed9fef6112537f017671068f99daa9380fb425771c4", + "format": 1 + }, + { + "name": "docs", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "docs/arista.eos.eos_acl_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bd3f5943071d6b6f18f2a1e2b8c99b2156ad4aa201d2359e707a56acf1a6130a", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_acls_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a94aed8beaca958713ec7b94bb9de2abe85fbfc669d12bed57f2f3b7277d0df6", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_banner_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b128807c32c6a491aa78a1b56512e2982f5d6811641d0b14e8e347d4cf8a5b06", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_bgp_address_family_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2848f5bc77219b5ed28aee87d0c1aeff0067e87b48ff9dbfcf6855b6d4d7dc21", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_bgp_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b3d9af5872ae5b1c5492e7c5c26f0df771560723f1bedf086f912d66ad605dc9", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_bgp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0a96d9a14d3cb8f07df3690093bc1c12c007d74ee7283ecd9892ba087a26ff6f", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_cliconf.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "52b6530cf3a4711a1b8e40dcff5063e73fc3e868e6cba0b91976e8ba53af8a14", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_command_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "581face7d73549d455f07613d7665a37b275137694b557bb5d87aad639adf49d", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_config_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eecae5ca3c0920b8dd021788000b1bb7c00bd5a95acdc45c04a3594327051938", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_eapi_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7d44d2a02822ef6bd44f951423cb9a970852522076260713e79a439eec19c5ea", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_facts_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3fd5b5627623b7c6b972c872e2e7e535fd9fb1c4c05aef6bbaba19c9aafc2122", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_hostname_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "248961e051dc070a9b283a64d5cc426a87e71efa3d5d985bb4e041b1781f0eb5", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_httpapi.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "74c0cc2f16ee0793613c76713e192749dcd24f3e73ecd49cca4599ed62c22f9e", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "74bcccf9763f905a928d9b864d04861e4f6918c930948ff1316d1c54fb7cf2f0", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_l2_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "611fd42eff9681cc2de52b3289f9ab84f0e06674d173d255d00f87dac2488d7b", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_l3_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e123839227429be6dd08bd60bd6ee7cf9c2fd421eb065a262497186f975302d1", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_lacp_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "14d1f3306a902caaec60817227a2b9b41267044a5a54bc1670dd6a55fbccd428", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_lacp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c1a6520e52c8882167cf2f30562949045d463c4e40e4b4adf301eeb9b5e9e58d", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_lag_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96627e7f51c810369bbd73584ec0351affefb9f1007390e840fde6f1eb23d3ca", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_lldp_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f0fea31fef727f45440a5363e764f99345b4f7e3d079fe5e36388f0ac2b20948", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_lldp_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c2b1858b141cce138e5a2f562c6a6c6e66c74acb8bad7f391e3b3acffdc40be5", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_lldp_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7aa54a176f3d95e20db2127d8b7428ff5ccd511016b007f80d469c7e64922ee2", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_logging_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "14c2e844470c657812c29e4ccf55c1c215f91d31cc7990ea195a82c0b118e00b", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_logging_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "939eefceedc0fe72bdc08cc3d7051ab08ab629d113aab2ea02974e75cd04988c", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_ntp_global_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b3e63ba5ddae4166099f537c44ffcd7cfccdff7c319ccd90d4f226150ef1b325", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_ospf_interfaces_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5b47d5816400ef01b0d573e0d5046114edc7722de466e4f653c51667c6170acb", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_ospfv2_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "38b6163ea43ab4f88040dfec4cd283a4eea0e35b92ae87463c0888adde78bcb5", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_ospfv3_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2a0dc26c17e8e7feba299ad66dc014533cf2c2a4630984dc8d7eb6eb38da26cb", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_prefix_lists_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d9895c47e0facb5ff6b2938b6620041a8f95602471f0d27ce54f6071c4d8ae6f", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_route_maps_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c39b1252e385d95b1d443720aeccd3ac6fd2ad597ddf5e76ea5ea347b05d7613", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_snmp_server_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "994c5c7c70fdb828ccdd69f9bba074b7411647d5437f59f5a5d5a3f4ee3d578f", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_static_routes_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "30e9194e6dde435a6413bdc1a752133aca0c356ad26b0c942f6f83702d9d6211", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_system_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b2bf42cdbef6a283cb6306b2f83bb9229d65a5ea6e744f67fa8818c39b2dbce7", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_user_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4b73fcd07e28314cc7b3ecbdf643c847015b95637d3f3c1d3a76b831032c9a5c", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_vlans_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6a1142b82a9c76a29ecaef4cced6e5ec3936eeb97c54601ef1458c9343a1b8f9", + "format": 1 + }, + { + "name": "docs/arista.eos.eos_vrf_module.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96f8cafc164b8d6431ef4c1d3f56c9e3ff712fe695db94af875d90cc1fcc92e6", + "format": 1 + }, + { + "name": "meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "meta/runtime.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "69670a3bc346361e18ee69fe1db6b47c18a20cd436bb72086e4b5e95d9ac3f36", + "format": 1 + }, + { + "name": "plugins", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/action", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/action/acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/banner.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/bgp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/bgp_address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/command.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/config.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/eapi.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/facts.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/hostname.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/l2_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/l3_interface.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/linkagg.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/lldp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/logging.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/logging_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/ntp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/prefix_lists.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/route_maps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/snmp_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/static_route.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/system.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/user.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/vlan.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/vrf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/action/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/action/eos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2cd721d7a0021e590a0d0cae8547c7329c6a7195e368e85cf8b4b04ba584d54", + "format": 1 + }, + { + "name": "plugins/cliconf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/cliconf/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/cliconf/eos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b543defd38a41e5e3ec1d6fc7baaf75d76da4db695be2f44b071ab653d54ea65", + "format": 1 + }, + { + "name": "plugins/filter", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/filter/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/httpapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/httpapi/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/httpapi/eos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f299ed9406aa61a5d072e7555b5eae76fef114b9494a093c8e9874e10a603954", + "format": 1 + }, + { + "name": "plugins/inventory", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/inventory/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/acl_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/acl_interfaces/acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6c0046bf6afab4a996e33f24201ed519569eb08acbf16761b5b11a314533c0d3", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/acls/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/acls/acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7edb5254efbad96919b6344dced7ca2825fea82ed161894fb32947c9230b5d6d", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/bgp_address_family", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/bgp_address_family/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/bgp_address_family/bgp_address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e219a1d388d9e62d9e5e8752ac2a6762bf30de1fe20367d9ec9e0a88c978b87d", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/bgp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/bgp_global/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6e3fe8902238d6352ed046fbc36527e5b814277123a53e2b5da37bcca2eb4550", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/facts", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/facts/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/facts/facts.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2c14a6c7b2ee25446a1d7eeda2dd5dc7acfb694719ffa90d8be271146291266", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/hostname", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/hostname/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/hostname/hostname.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "efb917c5d1ae4dda5fab13fad9f6132c614f22f1ea51046338715e8f5bdd2fa2", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/interfaces/interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "612279d76fe8e822c0b94fd23af3766e62811e27b2564bcfeedeb1eb5c94cb5c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/l2_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/l2_interfaces/l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "65c41dc95f80ca90d8833a275cdb9e480a10b9a196dbe87f7f60fc52aec24cdb", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/l3_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/l3_interfaces/l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0afcc24d23d35e458492c17efac75178b89d730a902907310aad2a2385c03d74", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lacp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lacp/lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b3f0f3894afa99a36f3ef7e6970a7ca4f5ddf1ee0f78e617f43467534fc76435", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lacp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lacp_interfaces/lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "af428e8eafdfd3e0dd804f01995bb19ba139200c29d115f943bdea29f03cb9ba", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lag_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lag_interfaces/lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "47ba1c980be914d8442a770d7e3f8d853ddd0b2f16cdf09e49626540a6b5ea54", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lldp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lldp_global/lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a7f1026b736127cb2e7700478502956fd2d82a3ae060d56843c34eeb59ed1cc3", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lldp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/lldp_interfaces/lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "19867782c170d8d43dba9d1f18eaca89971df1a153528ff64ed5e0aca3251e97", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/logging_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/logging_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/logging_global/logging_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2622ca645838091e8437dd720f2ed7574015fb51171e2f1b2414baf13b16a04c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ntp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ntp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ntp_global/ntp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "56e9a6a4aa20da957e209497d8a486de5778d6566b9b59d01d8a753163b5455f", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospf_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospf_interfaces/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dfa1590c0c70ddef240ef5fb993014c24214e6fa4ea42a08c52b1a9144049ba1", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospfv2/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospfv2/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5cac76000d64eae4f6a3dfaf9c1bc001637f7e31e4b92cdd04df8c3b544dd2f7", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospfv3/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/ospfv3/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8c05a7e649ddc285459fd9e69eb1b5f60988ce60c115d29961439b90cdd5fae8", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/prefix_lists", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/prefix_lists/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/prefix_lists/prefix_lists.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6e8db5f08a08179db44df3aa76e7b82cfb54deb2bde8583a683a267d1695d5c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/route_maps", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/route_maps/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/route_maps/route_maps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e56bf6c5fcac1647331f79af77bc2c75c80809ef6c2ff2323393094c320ff781", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/snmp_server", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/snmp_server/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/snmp_server/snmp_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1cfd87d2929d294b4921ef21b6db0d3e5f9eeb86ae1e997f7ed6ccb0d49d6104", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/static_routes/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/static_routes/static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ba889e4244aec9094d7db701cac2eb5b815f8ed0046f8a3e9c04fe6aa2fa217b", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/vlans/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/vlans/vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7559652223d1ec6112b628ebb5ec5575ac0df8a7861c1d34e8e4383af157e972", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/argspec/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/acl_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/acl_interfaces/acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9bcc84c7148d3f02b2d3b8d9cb3e50bdd1139abe5143bff27e5c9b20868e4ae9", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/acls/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/acls/acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0a61d9abda1eb471864b0b9f20f50a89c496659c6a02916e566fe1ba0b2380d1", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/bgp_address_family", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/bgp_address_family/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/bgp_address_family/bgp_address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "449bf1ed8975b0c2c5d8f0406f87561d8c475a869ea4b36b703a53f33e485963", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/bgp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/bgp_global/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "008cb853b542ce4e4a4ff28f2252855018af535568dea1af428cda6b57634319", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/hostname", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/hostname/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/hostname/hostname.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a0e020d8c1148be859bb789ef8a2d868916e3a9ac32f9954e6a878e6fcc1343c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/interfaces/interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b048d2445ad4f82022ea8e3ef02711fd22392324f154663a9c15b3a4181bdf12", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/l2_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/l2_interfaces/l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cafa38ba33cd92ceaa9757fdf4853562b6a05585e2eafcde72e8a153a3bfb811", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/l3_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/l3_interfaces/l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "671d24ae1302fa2ffc93a7410db998da06e2e3ca35335b85fbefed0dca634eaa", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lacp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lacp/lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "66fe47ba0b24b135e9e9d926236f6fea3e1900c02c2cb05b7704ab922f446fde", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lacp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lacp_interfaces/lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "09cc3fbfc6ddbd926c1425a4b62e43abc8a9393bfb1b14c49cf3b4ab58c5f987", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lag_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lag_interfaces/lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "86f2636c8a44b864c8b53bc799c0f7ec6166c55a435860ad413dc0c097ceac49", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lldp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lldp_global/lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "69ad272fdf21f4e0cedaf1cc0507238ccee6ad917211a5c0dd04e027ee5fbaa8", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lldp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/lldp_interfaces/lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cc4707fdf204c32f781c07f7b7824f3bb39f7c04924cf75918afd9f35c00e2d5", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/logging_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/logging_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/logging_global/logging_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2877f5747eead1587e92ab99d9daaabffda287c76d2a485f89e77591a89d7bc6", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ntp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ntp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ntp_global/ntp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "61ea3465ab0ff85439a847d968c8c00d1d966c839e08e0f4db95951f942adfc0", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospf_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospf_interfaces/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "530431a9bf9d551f742e24e54587ab583c50d2dd9a6f81dc7a7604a91e56500f", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospfv2/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospfv2/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a3717ac6166b33973e551c554a67d4f3b5a52b8e215061823ac52e9b66c4313", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospfv3/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/ospfv3/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cbba118ca02097c8f101fa8163dd4533687aa654c47af5f384361c15bbf18f6e", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/prefix_lists", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/prefix_lists/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/prefix_lists/prefix_lists.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3f8ca442e36c6e9eac52baeb69bae9252872bb4dd433da3dfd85e437274391d", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/route_maps", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/route_maps/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/route_maps/route_maps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4cf2bba32a5d31eea914f4316edaa3220b8c70999f281be36cc992e9e0dce6a7", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/snmp_server", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/snmp_server/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/snmp_server/snmp_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b8577aa776165a61ca16d1bd7b8f82dd951a853beb2cc10fdddf4d3ff2386e60", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/static_routes/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/static_routes/static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b9c311e50db4ce0154df789c5661f0e2dcba38ead5b9427d9d07096ed41aaee2", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/vlans/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/vlans/vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8a28a0e8ece189d0c244dbcd8f65277b8012178cac3553df6bf213162dff688e", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/config/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/acl_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/acl_interfaces/acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9dab98bc5b7651ffb351e6f455907a14d6f9edce78793bb2abc50793a526696", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/acls/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/acls/acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1e9d06a56d37ea1cc38f4bc3e975a38110eccfb02bd4d02f9b1c5c5987ab697d", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/bgp_address_family", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/bgp_address_family/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/bgp_address_family/bgp_address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "713c3dc0eee935154f158427bae98116584c593f9ef2a02cc2183a0aa1a073f4", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/bgp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/bgp_global/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7b037e31f1ba32c4d39d42d7b63164e4ad982fee2d23a681489ad947d222be1f", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/hostname", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/hostname/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/hostname/hostname.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7f0aa4b6dd78573bafa4984b8cc441ab1e5e5b1f5ce81b9c7d5012e631cbe54d", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/interfaces/interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "381dfacbf5de0b7e10e7998c2c9ef6de461f76106e597712f4e1d1f094373866", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/l2_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/l2_interfaces/l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3ffc4f7351fe5ea0ac3476b9242c40f56839cb455c8f81844bb8fe8b7abe7dd2", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/l3_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/l3_interfaces/l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "288c25e6439539b5ab38e4eb24ff13e2383b4997620a04ff9f5151e058865319", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lacp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lacp/lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "be88b1b00ffd9d2a1053c2e284d81b62753791bf1ae23f3124595991d87eb68b", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lacp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lacp_interfaces/lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8317aedd2a88b234a2af6ca54bc67d81423cec835cb42c52df7ac2b71132eb32", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lag_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lag_interfaces/lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "296a67cfe58f8450c03fb79f0dbfec348fead8478fe2966cedefd611bfc6b996", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/legacy", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/legacy/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/legacy/base.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ae7be9226844a6c41d306bf463c00087631931af57be3242325fe69994a022d7", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lldp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lldp_global/lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d4b1359483582657e92c964e22a4250d83f2f5b9cc81c1172cd23ef2b26698b3", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lldp_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/lldp_interfaces/lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a0fa6baa3560ab08624fb30a79f807e64db902d3f6db24237de6a1685625f0b5", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/logging_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/logging_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/logging_global/logging_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "310b7b976792690784c41fab723926c75b0ad79bbee6562d02ee869ea6e2b1bb", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ntp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ntp_global/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ntp_global/ntp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "577216d559173e21134dc506d580d527b150ecb7c450e0a7cc57d5ade06a0632", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospf_interfaces/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospf_interfaces/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ed0e26eb1dcb088e6492841b4ce09c8dee5d5b51e913bb389e155320815b92eb", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospfv2/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospfv2/ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "27328c3a07bd2e986780dc75d7878de801e937191d77650eaffba9907132ae96", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospfv3/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/ospfv3/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6c8aa3f3c4d5c36cff05e44876ff6e4165c3b8e77195a92d276637984a0a39a", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/prefix_lists", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/prefix_lists/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/prefix_lists/prefix_lists.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2de6d61f47175a1bad0d38f025e724821d8f3a8abfaa646eb45f5c271741d4b7", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/route_maps", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/route_maps/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/route_maps/route_maps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3a8e0c6554ba35f7aea6e59ee77998f6743ecc6489a275a06183ba21a7e10ddd", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/snmp_server", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/snmp_server/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/snmp_server/snmp_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "06d1b755cb083a6cd52d264cd436ff90713c1ffcde2f5ef29e5c195ef0303887", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/static_routes/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/static_routes/static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92d12a6d64f821005211e378906244327b65079ea3c773615feada839f678b02", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/vlans/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/vlans/vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "85e3a117c391b5fd5455588997f9b8c6a6ed586ebb510dee3eadf15b41524fa6", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/facts/facts.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e7331bdec12957b960b8e1951c7acb4fe7e90eb759bc1d77691a3efd97a0afe1", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/config/bgp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/config/bgp/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/config/bgp/address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fe71d209bb4ed7f7e4e527ad0181794be700417e2c338811849061cba130f3c0", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/config/bgp/neighbors.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4fd213d8022945b90746aec74e55ce5773f48bc51c770d6770faa5b9edf70417", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/config/bgp/process.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4cca1c0a1c00b59bc529674d5fa7c3eab9fc388af4614967a154c7a26a4ad58c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/config/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/cli/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/module.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b52006c8f96f10f8e3bcfa90697aee64220c85a152f83ce82d7516cd0a736c31", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/providers/providers.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dac6aa756020d92b0db728480170013f096c87389f0035dff4919334adaa9273", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/bgp_address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7a158b0833fa05d798d332873a5400488210d51569035070b8349aeb4ce30964", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d39494947370b65512f0429ce0d3e93de02aae9e7b1c67ba008f884ecabadab5", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/hostname.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ad569ba6de7f63168a5a8b6dff50abb5fb40e8329ba52c2412408526e22a5ca9", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/logging_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1c72afc32c41d92b2679a64d953f4ecc008990f8493546ab178d9d5797ee1df7", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/ntp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5d7983f6f0e9486dc88a68198106c8c6c4b3927f475e2def8b9cebf0702e2628", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3d4befffd9881adf431f9fd2010568ef349eb1767d4a125952e50932c12a2c1f", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ac269ead5d9b8dfe779208f65d278bf39cd61fcd91cc2c97dd3ea00bd75064f0", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/prefix_lists.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f4602d1d97809c09f7d472207a6b96b7ac058f33618cbcb5ad5b0ae593935a06", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/route_maps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e5e6c53a56d7346c55caa728299f11f3db706e7be58eeaae274e07788c6ba7c3", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/rm_templates/snmp_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f3173e8c9a9e17aa46121952040721a82b8dd0a14a309cd6a793a3f51f93d9bf", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/utils", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/utils/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/utils/utils.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3f7d9467ef57217864bdc55cd3cf38c58744ff24a124b7cb06f6914adcc67196", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/network/eos/eos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fd730a1fc3bd0c5ef0e604aee79afb799d0d15f0e201252043725bc44435866c", + "format": 1 + }, + { + "name": "plugins/module_utils/network/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/module_utils/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/modules", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/modules/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/modules/eos_acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dffc5b66412ba048c9b4ef4bcc0f27af5fe2f805485450da661963b7980b86bd", + "format": 1 + }, + { + "name": "plugins/modules/eos_acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5e066de071b7fac7aa304dd9051389d29d6d814c8e84ff1518532457a3f49cb", + "format": 1 + }, + { + "name": "plugins/modules/eos_banner.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c9a40fe93e2835e8e2ef138f63de065a737fee2710b108b7ac7c3fdbba5002a8", + "format": 1 + }, + { + "name": "plugins/modules/eos_bgp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "81f6df8f4bdbb49dfb362cb4f6f1be725eb58880d0fd130912c064d81392abc0", + "format": 1 + }, + { + "name": "plugins/modules/eos_bgp_address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0855ab5e39574228ac20e05bde1e0460931a1ec0fbe1fd274fdf0ae567807019", + "format": 1 + }, + { + "name": "plugins/modules/eos_bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "335586e03f0a9b8a6bf3329f90639eb32b0b78a4fd5e64bf4b95eaec4642545b", + "format": 1 + }, + { + "name": "plugins/modules/eos_command.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5e2e3b77e337f259e6d98b46923b363fd56caae339baad75426ab3a299257eb5", + "format": 1 + }, + { + "name": "plugins/modules/eos_config.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "928d6defbd9036ea351ee30c67cf290ed4894036068ab5fa5897bfc9c7a00feb", + "format": 1 + }, + { + "name": "plugins/modules/eos_eapi.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "10baf8783de260b3d4987837a488e162374fd5f7ac46a436bdc902f54ada4675", + "format": 1 + }, + { + "name": "plugins/modules/eos_facts.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d1d2227f9c1a7e65f7a388d06631dc08f45ca6f4f58f44011133f5fd5c8f79e", + "format": 1 + }, + { + "name": "plugins/modules/eos_hostname.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cf0e35f2b3765bb25d5950e6c91681ded597c31faaf3eae64afe445d3fbb72ba", + "format": 1 + }, + { + "name": "plugins/modules/eos_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0f7f0c7940992d72766effe9fbe5837351911b7c39c68ac510d2f49202627a60", + "format": 1 + }, + { + "name": "plugins/modules/eos_l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8554efe1c6868e5d68b76e9fecd4835978403942c41b66b46d0ac96f272d4b1e", + "format": 1 + }, + { + "name": "plugins/modules/eos_l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0484177d5f87109f6890c88a76545832eda63db662a0337fd27366fec66976d8", + "format": 1 + }, + { + "name": "plugins/modules/eos_lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b120e44e4f4dcb6b3b0e0b5323a54acaeeade4d05ff579f08fc30af69550ca87", + "format": 1 + }, + { + "name": "plugins/modules/eos_lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "35545f0df6e96f1ad2747ad9e6782b100ca571b354a2c17b99d55e378ce9900a", + "format": 1 + }, + { + "name": "plugins/modules/eos_lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3fc25733ebca35a7d6ce3eb49255a0af16a3091b86069e955f8faf9fb3158c56", + "format": 1 + }, + { + "name": "plugins/modules/eos_lldp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2f477f9e4ececee706fcc9de764dd76fabfbc958b608034bbb6c556e92af836d", + "format": 1 + }, + { + "name": "plugins/modules/eos_lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3ec639faf3df0ff7bad3856d6fc62ba7c9540353eebf8739789d6e5a564eb8f6", + "format": 1 + }, + { + "name": "plugins/modules/eos_lldp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "77926d1a7170487fb7a35933005bd3aa6739136d79ede07eb31d4c28041af86e", + "format": 1 + }, + { + "name": "plugins/modules/eos_logging.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "06f0cc89d0706a8fbd34eed1f3b549471920309589d197ee5eb813cc94242096", + "format": 1 + }, + { + "name": "plugins/modules/eos_logging_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "533c33b76192e2e20cb6f68edf1d2faefaff522de72e45b039a6592db7f75a5b", + "format": 1 + }, + { + "name": "plugins/modules/eos_ntp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "652d06cea3f84829516fe5b322978e5883602c6efaf597d64aeb32e0308f3451", + "format": 1 + }, + { + "name": "plugins/modules/eos_ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "df6a85528f7ffd00eff97da8786683a980307dba93805e32eb6860f2446f0ace", + "format": 1 + }, + { + "name": "plugins/modules/eos_ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b09a1369332f58f635a167116a34c98c5df0402a648f6c9ac865219ee157a416", + "format": 1 + }, + { + "name": "plugins/modules/eos_ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0daf72a054da083ded9df445dc2c5f2a0afcdc4c158b43db0974e54beb66b239", + "format": 1 + }, + { + "name": "plugins/modules/eos_prefix_lists.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "777a6b476c1259c21b82f9b4dc2ed44c824274e7150aabe83938731f4654072b", + "format": 1 + }, + { + "name": "plugins/modules/eos_route_maps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "303a4e384e71fdca3b52f78bcb0b659a51ceff2709f49c106671498dc99e762f", + "format": 1 + }, + { + "name": "plugins/modules/eos_snmp_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "16385a6a853ef36ac311ec2067ba389ee85a0cef5dcf0662643836a963d9ff70", + "format": 1 + }, + { + "name": "plugins/modules/eos_static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e97fdb21e12c56449f2be0df87695c8fef7af503c532499d7642c3bb89cb58ae", + "format": 1 + }, + { + "name": "plugins/modules/eos_system.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "613e0159ccaeb41f0df5ead02effe8c4639cf5905d7caae648f031b972fc68c8", + "format": 1 + }, + { + "name": "plugins/modules/eos_user.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "56320fd94aaa4e7537f5443f99f30b3e27b6c5cfbcde91c721f585df7b3ad04e", + "format": 1 + }, + { + "name": "plugins/modules/eos_vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b4ba58768680a041addb0599fb365c19d2407b8b015d5676ff66aa05ae413c6", + "format": 1 + }, + { + "name": "plugins/modules/eos_vrf.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "43852a94548a65b760502abe46fb5cc4af0850bc31d250fb8e1aa4411c728e94", + "format": 1 + }, + { + "name": "plugins/terminal", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "plugins/terminal/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "plugins/terminal/eos.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3ea1b198625696b314fb39b4f4db5dccc2ddc22d89fdb75fd0ec58ee3c2bb241", + "format": 1 + }, + { + "name": "tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a79b77c93a1982c2682c177681bfcef5f3fb3421e3ef10be452fc81dc3ce8871", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dad0f95e9549bce843069bc4584803994e2549a64e70c6d844e5d37e41190630", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4cfbb7d9c017eea2318fb53edf60ff9b83e6dfeccae2d6bc85f16d05d33a7ff0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b87b082bd1a6efb8a4fcffbc804615955068460aa128235e5bc6833b551be9b2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dfc9f3e78036a19826feccd2fad6679dd22d05d44fdf5226540ce1f29256f261", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e304de25e98dfbbd3e8b884f6478d7b841a022b232febe94380f256a50a51557", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e43043f8a8c88832634fb29c4839abc2be35598c34df4a953d0eda562a90c78e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1668ec34e8d2f67dc611925ddf3b4f00ae826f0a65c72d939a8b1046d64c873d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1f5be632f4525a5de8591f6aa83113ccf37fd9cb62d0f5b6ef4c62dcfb1c6fa7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "86b04f3482cda3dd386cac6bd225865c4f3637845bc2b38165814e6c89bbaa2a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "876b6b7da3c239e569da81974334a14293ce92683bae9643239bcd4bb083c94b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0d3dca47353e80e36f629fd572a1b64e2c49dd75d82bf4ab28fc53634d33803b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2b15009df3b8b2bd9936379027b7f544a9c81a23e5c33fb9847b25a0b54645c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acl_interfaces/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8631d3b93d4bf6c66a2d3f5e5c11f188f364dc3a36a4bfa5614a51a045a1d49f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "123f47356786e4facd8bf8169639c0286878d1ad6e37b71c283d8729848ee841", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9f3757d49c81f01e6fdc9ed127fe45328fca0d8bb2871cf5277a0af7f27ea533", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "25852caa484a525b76e22e5d7a3b3e342764303140a98f3c1c9f15dde4231776", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/_parsed_cfg.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6dcdb52677d56b4ae0290de99c8cd013fb1aae46a1a08e59c84d8f15fffa7205", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "adf72055e9bffeaa9a7d332e77898a2ff6f1748eb02046d0867c907601c72cc7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c567c0a070d35ae7dc0def99be6a57bdf14d0485dd785e72c4c9e192c98d12ec", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6688f31ad22c98409e9af72340492edcfb288cef4d3c30037ed424b886cf634e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d9b49e9cd0c20334e2f3ac1aaa7cf75fa51acfe5d2d47b60d35d77260d77b145", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8ae640e0d6726b443b36e33c066555aab81c0c865d21f92a9218fb449839df17", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "161b63801d5e2e1ed876dc6929ab54c7f2f89bef189ab4b7f394679b6561b244", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8b73e35944c74b107af433bbcc6e7b7c4cf64f928a29dadffa1f8d469c1c6d25", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "50f9aa1e9a9c7e29fc6efd923caa8cfb358bbd69417b539d2ecd978af5e1519c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "02a799009a3c14748b28e1ca595ec784e16f7589e3d08786991775bb73edc628", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0659d10743e2796f81f48bae653e0cdf722e3999e7c2593453290fd0eafaf63e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_acls/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4ac57542e8c5b785dac916943f46c3166ab7e8ed158541a5f38c8d83ba8247c2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tests/cli/basic-login.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a6ff4ad57df259c1322d52be030e6bda317af6738e2e3ebf043ca14b5fc9d64", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tests/cli/basic-motd.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4b2551d785983506768deb63cd2f8ba8ae35c5e6ce5eae18e340fd75291e390a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tests/eapi/basic-login.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d7cd4bec5ba015f96ac020675f8b4a256dcc1e2bdd9f4b59775237acaa8d809c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_banner/tests/eapi/basic-motd.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8e94533c27b7c01e870af443aae37c16cb5180e86658a8de5a2a6b5599efb97", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d0f3e120b5e0f83314d06ed429b515b98e122ebdd4111b4e5be0bf09098877c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp/tests/cli/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9bdebd0673be1e39039dcb426a889e569042dad0c5cb7b2bf01ba68d7091b894", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e40fe291a7e7d70bd846b4acf8f4a1a465948b9a02b037d9b0fd0a4193055baa", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tasks/redirection.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7b61bd7a713c0b9735361ff90fb07b90d1b4fb97b9c822c2c979bd6eb82b892c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0b889f292c92b4630f9cd7f3ff38826eb0db4f2937fc2f9e5af1f266245cca74", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0b889f292c92b4630f9cd7f3ff38826eb0db4f2937fc2f9e5af1f266245cca74", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/_redirection.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6ed262f5f0ecec25b856f900c3bf6d2b460b8988d495e8b8bd2a94be0e4b136f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "36c8fb15c11b0806cf005745d3430a56d953e9f6780a7cef5aafd2a09a0535ad", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d367a172a6119e19318a7925d0f93ab844f3285d5e7818894d5754dff1c3879", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1e8015071f7ffcce80ad0ededdef7f16e73a69a32d9f045d358db22e27e0bc37", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a72b2cdd640e76fd8cebc5dc40db9e7f021f219a006e0e202f38753e67f3e66", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b2bbbe9bb69931adedbcb614bd349ce9dc7291f38b6dfa81420db786051dac73", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "19423e7d29df73b400d5b47fea1fce275bcd2b04d184470aa5659097038915e1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6039629f8dcaf5a5985dde73f3aeadf9a238c6bb09cba2cf52953fd33d75fdf", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "501991afb657b98d52a6b17858e19fc4def44d6fc1b308af9d9339ed9b1bcbfc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b772bb07168e677fd6bf5c7cefdb28b4343d2c51f4463422e7b6a0cf9959f327", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "768a7c9e05c637f812712a5de2588a2fae4c9296e89f082ef30ce5efefe0939a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_address_family/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "80bb6f23199fee8ae2ed4149e4706e9a23f0b0093a9f03c982fc8f3590919fc5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cbb352548a62d123453d921de875e2acb84594a405ddafe0c04460de66e62928", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/templates/populate_af.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a890c9293ff8120b194c107a6f70bdca6d62433ed701398a8214feaecb42bba6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cbb352548a62d123453d921de875e2acb84594a405ddafe0c04460de66e62928", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/_populate_af.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4f02550439ab2971f3dedc3958ee676bf2f3dd53532dca527bc619cf2f1a1d9e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "36c8fb15c11b0806cf005745d3430a56d953e9f6780a7cef5aafd2a09a0535ad", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4d04fc66d72fa6c188227956f100f60c5653c829ef71f493379e1aaaed85fb60", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5d8689ef6e49ccbba62ad1ebc44268ac6d8f82c7f001b21251b5d09c7ec7d32b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c0343e2441998a70cccd7a221674cd22a585a30cb660edf3089ac0b090e798f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6fd9e647d40d57feb5aa630c4ad460edcc0a5053310451f19ede0fd8d741ffe3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de7a1434091a39ef8cc7b4dd5439d3b37ae5b77a68f90ff04d5a83160cdbfc9b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/purged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c4383c852e0367d67b96145d03829375611f90a60fa91aebf9ae41e7f8de1d2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58ef58d4be3aa6e9478afcdb9010c490d331d3523a5d4804a0a68f3d1555d9d9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c43d6297de44a8d0ff51684af71b0f6837eaaa5d475561572902e6683b194247", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f749361ee14f98e79fa6a1f95335d7c2e66d2c28f517b1852b5b7f4cfbb9d429", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_bgp_global/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a1c6b658736d10bad13d5b973aa9955f414ef50fa30aa23a890374ab544a2f3b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6cec8117492a3110c2e9066aa77a54abd2b9774cea08d60eb42b01c51c3e032", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/bad_operator.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7519d9b6d82234763393ccb21be1c3b1aee3457627c963bddb6db8ddb11df7ea", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/cli_command.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "da86906ca5b2fd63ecc66e426e89f951058a3c90f0e9fd36accf6001837fda25", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/contains.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e4e02af125647f0d0812ea8f3d43e8ca78a8ba11e4a572c39a8a061f836aada7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/equal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "762cb51b120a123a9af5a8256b45ff6103bf26624e6425e4a8b42c1c34cb70df", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/greaterthan.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "84cf8932e41d9e08041c38f84dfb9b1d62680abc42a4b645245ef5fd365b362a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/greaterthanorequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0410c3b348dcd910c449696a7ca05847e90d4e9d0504287ef1ede60d9f526308", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/invalid.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b5fad1e7df8589dfd24573eb51f93dfb513d5fae99d434fd92edeb5ee1e96945", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/lessthan.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6829309ca8cf687d623c0c9f497e1f145aea6dc7df99c832174e549c18c83620", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/lessthanorequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "02dac1c05e69cfe6e0db11694305e27d5cf5c18b916c83725145a01c45d151ce", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/notequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3bb2dfd7a6a694105573c6eadaa72f817458acc9dcb0dd0a1a854d319d09cef5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/output.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c4f066d2e8544080a5cf534d49cac23b6af9380724df99f1ac2ea601fdae230d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/timeout.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0710688d24996846459569d49568102b47517ceb62da0be0168f8f4cc10744b2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/cli/version.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7e1ca984e5d0cff37df1d4029e0a9044daa287e5b6355387920054695dfd61cc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/bad_operator.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92b19c1a1597bad3fe8920c6d15810f2df039981b9488dc802e31b599255ca7c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/contains.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "35fa217e836688b2d7399c66f9408109429434afe4e85a78fa57ba9d440e7083", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/equal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bf0a37bd334e4ac7039fa458189a52163c074d38da24e01b4e31b1a5df564bf5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/greaterthan.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c4156873ff938c4126af0092303770286cd3c1829ec579689a0413d85b57a7d6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/greaterthanorequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "58247b34643e80aa852c3069ab18673c02c98a30845b2edc808262ccd0e26a37", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/invalid.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e0ff41bbdbf781316e8f8b28ae72d5c6f2dd45d9040e340ed8e089632c62dfb5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/lessthan.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9cf1473ef81732265c8fab9d4aac0e2412a160b4cd1b8bccf474a6b4b872093a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/lessthanorequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5762ba9c8c56c10a9473447afc5e4be6f14c8a13f64840fe001e0b1fb1a0cf9a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/notequal.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fa8076a05fc1d4cfc801e077a2204d20cb1c7eca29ee7efca969fb68bb4969a9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/output.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "693de41c9288eff0fecd465d42917945b0304d9ed5e0ac8f0370e25daf21b8c3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/timeout.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "77c15954650a439dd4fad91b81be94d802c38168a3ab63478d957492874362e5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_command/tests/eapi/version.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3a28c24b52f933e2a767f91719be61f48f473d42854b0f2bb17583d1ec9b6d6a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tasks/cli_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cad1c35e72ece6063b7dd0600ae72e4e0f2f29b963d58733833bfb71db1ff1dc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fbf830cf0b2f6eccbbf21e658888b119977106bee0aa263cc2ac4393ddc19d4f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tasks/redirection.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b49deae160fc4dfe8307a0ffb0749eedf58bfe63871c77531866e164fe7f955b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/templates/basic", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/templates/basic/cmds.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "635043eb1da106cc08711181db0d52331cc4ba2cda07e30466641f4c7497f10f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/templates/basic/config.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d6e2f3a34e61e1912c313154341699bc6398ccd884e4663bbdcefab7e76f6ec", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/templates/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/templates/defaults/config.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "82249ebe8dcfdb0ab85598bd0f7ba759187bfc19c5c04a772d3308f27d85eefe", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/templates/defaults/test.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d6e2f3a34e61e1912c313154341699bc6398ccd884e4663bbdcefab7e76f6ec", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/backup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d9bdcefed31e07edf3c37a38a9bdd50b83b235723758b4f4afee6afddb1b9e5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/check_mode.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8b8ade7952b3bdfbe87a27bef6a6072bf1559fb682ed03477c2c4bbb95add14d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9a76cb30e8f9c86209fa61ebfd779b91e9f5996a527b4856ec5d1f91d5bdfb77", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/defaults.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4390d24f8debc9f9a06bd6f75cedac8f6de373193dd6f477329d0479908e66b7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/diff_against_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1ba680c356fa88e96ed721f29df59097b2aabe32030286f032e3f981db797276", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/save.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b576d2db1098db6187c8dabf08b98f2f768c955c0fc76d32f946c50df47d3bc3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/src_basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "115d6ac4c64b7d029afd2ddb9588b5eeb323ccf12391cf9bc1ba7db051c0847e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/src_invalid.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "52ca0bec01fc312731dc6e4be0b4439a1ffcbdb24716321987fbea517a5e145a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/src_match_none.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e6f0ba65100459757c0b7dab013d12f4b901e2af19979c49047b6c403e2a1877", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/sublevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0f7743e4751629f7b7b985959361b7ac07cf23c267d74777401cd2e45bcff7d1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/sublevel_block.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f954e5787b9b7e557b058e9f4e8720bfe36b468b4822bf29913ed3d14042475c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/sublevel_exact.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8a6f66fe3cca7fc667d32dd2de4f5bc6fc7d82d2d92953316ad3d6e4f16ec463", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/sublevel_strict.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eb86226952eb153150fe0e1b41d8bbd2d38bbb2323831ff4a865553f161ead28", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/sublevel_strict_mul_parents.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3ab71a8f63f346ecaac7f063da41865f2e61466559bd8e3b01c5c8cd5d4e63ff", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/toplevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb6ec870503106ced6935c661248ff3e9d637bafc418f9b50f6bd01329c26ce2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/toplevel_after.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "caea8fad79205e27a673f4ee9fe66ae8337bed0172587d7f41f27f4c3354fa2d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli/toplevel_before.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "727839044c517b93bff6eeb4786a005f52b4c17adcca79db896113ef5a788ff5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli_config", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli_config/cli_backup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3bd7e06189b2e0a2c94746eeacb0988676f417f3a6740b1ef65a39609ae5d735", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/cli_config/cli_basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "135e26aae8c87670f187e83c82608ece8fe523e21e51824780e082ed0b4bf4ff", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/backup.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8b7ff6fa23044a1941225d49d2d23d85c1cede5f6d194625515b78a94ceccef0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/defaults.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0ece39d7ef9b05d0e14b28c199af6dd0181c05c687fcf8555b7e41f35406f4c6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/save.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b10fe8c1dec1cc8276a16bcfeb6b70ac9667c8fc42cc5acd7f742fbdd2a2a2f6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/src_basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bb891145f21b067fae034a29cded633ad42f8c834d477f8997b2517753fa7300", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/src_invalid.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "751ce477a9a859e0fe8c0a420a836a9aeb6ee4e4d00d58af9e96fa4b15731577", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/src_match_none.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c42bb681923e1aea5664c1a629c22da23afd186fbdcbaa1c8f6a5df716e69bec", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/sublevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "402e518d37d1d8a5c283de5593d26f4067c6ce3312b90e9f9b5c41c8c52892af", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/sublevel_block.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3dde12483d855a7b2da463f885ac18f0b10b36b9b6acc538de96c4de23157c61", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/sublevel_exact.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5501acfbe1e6d31324268704c74ddf6bf1d7d9eb0e158edcbbe4ff4b214cc76a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/sublevel_strict.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dbf1e3fd93dc6e50049a62d8107765cdbba14ee1f843606845bf30d0a982cd42", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/toplevel.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "45276c0a74aba09ed8c7c48de80af2dd32219a324303610bc9cf80c3c8bc283b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/toplevel_after.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90e106e955ff3865916079955ddf5af545cdaa7372c491bf0ba61076cd80bb4c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/eapi/toplevel_before.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7f7329aacb123f76e1a2df214a99787da817035c59e9c0e2664f7934daba6efe", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/redirection", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/redirection/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/tests/redirection/cli/shortname.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d944cd696544ff17ad20e40bea70421da8141a1c22b5b4227b8b2cec348ce085", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_config/config.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9a925a8805c82634beb0a514ef8ab88912b8b3e296763329a74d7690b0429dc6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d0f3e120b5e0f83314d06ed429b515b98e122ebdd4111b4e5be0bf09098877c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/badtransport.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1620fab5693bd0fb373e2d53372188eb73a2fe5a3d389b11052ea42df490ee26", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "37b279c3fc0c94ed140a3e3890e309424710bcd35856f31b4211d5e7841f4656", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/configure.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6efb0ff5e69c8eb46e1101343bc93272549578ad68a74fede9781a99bfb5983a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/off.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "593ed779304b25cb537ca13fc88e95a91a938109f5d5f9f6722a29f37573c040", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/on.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "626f6ef04d9b5eeec3c2633d9517c0c632fe4b758470326278e7df918eec58c1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/start.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "66702395e736d29c01bdfcf6f45a349937108ce757696dde4cef46ca1986ba7c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/stop.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "70621105e0b6c97e34047f0ce8408da1cb5e03868c8678df2f28bcf817c57527", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/vrf.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "64545c869099218860beec3678baf8209b39d66a5841128afafc15775a6e9eff", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_eapi/tests/cli/zzz_reset.1", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "01cd53e28355e0d65ba10accb15c95a17f824555796003f0225d7879a40382e9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6cec8117492a3110c2e9066aa77a54abd2b9774cea08d60eb42b01c51c3e032", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cb15ea77586a3f5e330abaeb5a693d1e431f3ba0d68e867fa6658ef1d00fc197", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/cli/all_facts.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9e88adb456f3bf5b08ce7b72aaa11b73bfaebd5563b39ecf155ca55bc5e326ee", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/cli/default_facts.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0ae6cae32ba80370ac7e8254cc4103412ad26ff7ef67467f860501a93bd7ba03", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/cli/invalid_subset.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "30ebae89f553fe7b179031c471332dde8a564a6fa8c280d90044283b59d635cf", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/cli/not_hardware.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "347997e8a2b793de8202fa7c55fe8fb5befc15f804046653b24305aa96dea558", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/eapi/all_facts.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "65f1bede3bea1ae5490850f77a0d8e0d5d369af4e05050b0cef51b7bc3430859", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/eapi/default_facts.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "784e54cb91e72291cb7c430e617b1b70840fea8f67ab2667fe8c18ad3aff5c0e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/eapi/invalid_subset.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb127eb858414a991f7de95891bc3fb5205f0cec63fab24c58717c26355a6b18", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_facts/tests/eapi/not_hardware.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "412ad00f379dfbf2c04c539173c7c88068c175cf54fc2336644e1f0bfbbdc1c0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "55cfe4746ef24943eac865d5b0fd9b6a6884e0e529983e253d5764175c01c6e9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "55cfe4746ef24943eac865d5b0fd9b6a6884e0e529983e253d5764175c01c6e9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bbd01a1b82535d87fb2c5192c045a1452c02385b1d9325bdcb8013b03f3840d5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e8f9622547f2e0fa5c603e7d1e76348d76da8bac90ebfa21179749ee691cd648", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "969820bbaeb224608a4aab530cbeeb88627ac039bcacf2a1942ec42705e5514d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aed726bbfbc34673f8da380cceaac909741a8a4533d1abf057afb6d9f5b0b214", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "079da330b620d09b22c55b8c63db98278c3347639db086a2c86f0039f2d13f35", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "36160ee5a95d8b19e314fbe8b473f56c8dc87e209f3c9394803a1b7a900f9ed4", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9093ee823c0145791216cf2d53f00df72c6ba361f525b2337b6645bdb7d3e8c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d89644559714c65b378af2d9a1e23c0432a2f1abd4fb09f3538f844430dc06d3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "784e0e5db4b302883890287cd2ba18d7005403f1c05be8c8c23f7d8b1f807cea", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_hostname/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9762cc4a787aec50485af807234f50902fde96f57e6ad904e62a9588c1f61373", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/templates/reset.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0a096e71ea1c5a1c492cc2e33283e427338efdf9d837a590b582c2702ccee07e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "36a0793cac2c404b733a21498bf803d7fc38942c11ea65ea26521ca4d64e04d8", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7ae46767fb3bead2365a6cc3aeb9acfb44d8ad8fdee5313f144fe1d248110eaf", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a62f1fe641f551ad15f8c85593b987486f1099f5a9172a1b27e73b4520e8ee29", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bc26969057893c4516d300b795ab9a9ca599596ea075a83972b2af4ed2164596", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7f0746803db7cb46077bb261ea73492246c9973b05d4369c4830edd6181bf453", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a0737935c23ff3552dcf975ee16cfa42adfbcea87cf8bb0b8926b2ccf09c8d0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d7fe951ce7d79d1fee4fa2149e1f341d06c7910a220bda9e86118ea26349fef", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0c3a7c9a205c5ff75308f7bb5b9ec60565eb624f45526d5712b3e1ed026e087a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fed3bcba071a6d00304fba18b40062463af1e4f9098048ca4385c8ee7d3703ee", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ca023a36a14d5f2de1b213f4e7626424523c01e952e08789e5cac48107ae0b4f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ca4a201cb5ed8e1649d04eba504fc0ba0584b9404df7d3fdc3df1d9cb708c992", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_interfaces/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "21f21b62a39efa62ebd86dc0b152614f89828c29b70b513a5eab734ba59bb230", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3d287a5645a94634b96fbeb33a93d7cc866421adb10d5e45810aae4ae003fd52", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90b0fb30b63afdda9bc8d5bee03e2b6cc6f785a7af550690bf002a207fa42d9c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/_cleanup.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "72c891a2b69fea4a08d88aef80ab42588f0761b3fcee4654ea769a82e2cad772", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9f5bae45f76d827baaed602070abd64acc8a7c7f22410e169b0871344f1023ba", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cb38b9a77caba2c84ab6c80ba15134346ae856147e816086b43f2c90a0e8014e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fce0cbcecc5da5700eadd7509b5ec52749d2161ff7b3f99b95a4d2796c158f4c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "aaf8f107ec4a7699b08aba428c96066164570af0da4c031499210e65a9ac976a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c9f82a69c636f9d85ef893fb5d2fba696d0a47bc9fe1e2c3e316acb63b79453d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "01c98f37d467b49d62c858aa1eb80e31829d3af8df1d67b17b95612b1e014d2f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7fe18f0fa44accb4bdd0464888179e38186b2bc1bb7534786d823700eab75201", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "edb8b0ac8acd4b5e054bbfa29800537c9b159ab96d7187400f26c80be72c7abf", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e27eed12e565edc2ef8199044486e7df6759cf3a8fa2c4999c06d465b416ac11", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0ed56a5c9ced6b499dda2d9788c2021ea24b0d17f0d0931a7c11b9addc59f3e6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ab629c595374a5ff76a3d76f22278948131ccfd3f5de5e08f8bb0fae170883c0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l2_interfaces/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d11de6e7c7e491f1f5247e77d3cc3367368e71c12900e057007742b5f69b93e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1629beb9c4c49792f78a1425442a6a6e0e5dd9a0ed824c1cced81e6e97a0e47c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/templates/reset.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3e02b044e876b189ce336a3a4802eb8af3df7d69c9d74f94877a8ec495e240dc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1be80d6bfade12c26b76660664893c1846149bb7eb9398fa5e610d48d54e9b78", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cbf3a7bcba86ab51a41f5df9700c3361614a761a59c7a818e28b9e2b47e49826", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cc35e0f775451453ac2c523a27b8ca29590551f20ba1dd504553b72cd3f48096", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "95215014c2825aee51c3c204de545ae03738dae62b0e268c617a498276643713", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c4177bbc89805770c555ca12366593738cd4fcfe2830e23b35a286aecc43ed3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a65aac4ca425465052942c3fd31c9d51ffb175047cbce064752fab288c7e4367", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f17e653bfdb385c99bf7db088d3269b67d962148561c5b4ae3248adfad050ce4", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "03f049dcce225d8de33873ff4f8a2244b4e6053857d212b6bd473476cd429b14", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c06867d92daaf7f51b661451f56dd63be75711f4f8c407a7f7365879cb4d295c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e8b467b03ab2c858ce56d5520307e0482341b16e05579f077e5bf8742d71fc95", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4660abfc6652a70079d0ea81ddca1be88fe04998d9396edef977e7c5ba5df1af", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_l3_interfaces/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9bd8cfc16471691295c6cc5b75efdef88860f2aad20ec00f62ffc614e2976776", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f53f0ae420b815a40999516a0df43dbf6be6478362d4fd00f938647cd31ea997", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d01e053990d738bcb911756ab9be2a7659b592d0841d98a1efbe9f4abb2528c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "800ead8f10e3d4bc50ddf469a53b358695197f47476eb4b3789aa011e16f1dea", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d0dcc0055c8b24c34f55531d55a1069274e7450a6592a5223e9976887437cd33", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "256d175eb92a50a737d23b476ff3fe20d9999764b3cdac3fe3f625bc357bc809", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7cc12a2c9c2b6154d7474af3cc090677b5067fa213c13ba6fb8b4203b9aa0149", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "298c194b94ae3f3750c516e2245251ed37611565c429ccf4fd7427c22df368cd", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1567cbeeee2362aa296686ff39b8a1fb0e95ee41adfb130e8612826981e7113d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "14973e3f346a4f8643baff860e9a35d46a16d7ed42212bc804ffa2b78f70c023", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bfdee3db7e752c613eb903f5b515c30d6ae3b5da4b641f9c575416aa32d77649", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dade4172a3223fc93e1eca92c3303456eb1f6c154c4cbcedad9a1e267821a311", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f53f0ae420b815a40999516a0df43dbf6be6478362d4fd00f938647cd31ea997", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d01e053990d738bcb911756ab9be2a7659b592d0841d98a1efbe9f4abb2528c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c0e130c100282c8de2a2d63717b5e5960124ffd70fe3dcb644596b555f254b8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a3796a2313899acffb35cddcaa5673d76efd8751d1fed12d820f5973a9476d8d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b36bf6f528c9b79fc7a9b7f2d3b182ca1f2ddd3339579701d92b36b019ec959d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d6a728cf70443f8ffc3ff061c9ee8d1eb85866c930760f3b277200956f41fb99", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2b46d6ceee61ab907fcb57229bf38f361785e90cba1c90ac5ff50d4e9513a3d7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1a8a850858d11124418c7fbc26742397895220754befde252ad24117705e3deb", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cce344c093d2137f12b8a9933298953bc3330081dcbae362088a5097b2514813", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f924be9202c965db71f4880a635ba5acc81f9cb91f0101907f3e96387674e8f7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e2bc98e817414304b3ad22cf0d6747e9908af6b692824cb5dd751058968e2de3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c417f982e3ee716d3de8a1bd93a0671eb29a513a6e4b62b7ec9ab6a06e038511", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "45ec3d12aef7d086d901f4bba8e6084fe7a13cf8b31f321621c598fa2cb88405", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lacp_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4bcd6ab1c2fc53eb4c774397a6ee078ce4382963c6ffb53e7514a13721c24974", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f53f0ae420b815a40999516a0df43dbf6be6478362d4fd00f938647cd31ea997", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d01e053990d738bcb911756ab9be2a7659b592d0841d98a1efbe9f4abb2528c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e8dd392df3bb210172a0fb991fafc904367293cc00e7dbdd2289ab477d58011b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e67fbf115a90966048b5dd75e61b370f6001fdebaf1da0c8cd8670e7593ef086", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b58309f8938bba932257668c1dd8e88057583702dd483304b451dc2bcb3d2389", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bb70b82e4f2780065245088e2a0868d4bd3ac4d78772c3533772904502384b7f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b05efe5f17248475b35be8de1008f92763eabc0a46f7e6e6ef721d0ed1c0d005", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ac0aaba7718ec98d92a4b78ded3ee5dd5c7b0f7bbf4eb62a00200769ebd84362", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d4e9b522c4e33d097cea87a3bfbdb7d7c0420be389b4b2ae4b0ec2c1dc9c1589", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c49e1972ec01b3646c6d93d8dce2d3672048797e780cd160b4b721a08b348d89", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0a09e158385c2158469622bdd80fbaacde054cc03c780e2f895973c59413eb38", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/tests/cli/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ec7f5172df48561a7661707c31befc2372876e79536cf8452cce42131e26efa3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lag_interfaces/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "594c6341406e70e47b7f9a9af53f481c6876cea084a03beca4068406e59f149c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6c58c665f3d46c7e382b12352535b4c300ea576b2c8e2e075b93a6ce18f2031b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tests/cli/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "53b18d54488b69edfd167f85e21b91301fdea473379481f5d96be206edd7124f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp/tests/eapi/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f7b48fe0eac8caa3e2d627764dfa3fb2a4d9ccb00db62e4fad31670c2a390671", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f53f0ae420b815a40999516a0df43dbf6be6478362d4fd00f938647cd31ea997", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d01e053990d738bcb911756ab9be2a7659b592d0841d98a1efbe9f4abb2528c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0048d6a4374fade15d938c1d79b79eb8b3d95500fe31a55b8e2509b3fc39cef6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "97c3ee1287e7584f46521ddc1bd32b3f6928c6f0c2f30fb00ded22272649ab1d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b4cce5198a2d66a44e8775b311ff670c877aed0d7d37c5f7b43d843f0f1e1f08", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "44cb429ba9a7352289e7ce9c1f1b46965ea1c360510d031c554472b04012c4ae", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4ac4431a75c62d1a70050d834f822be901e87b57cf6178b14069bd0dba8a95fe", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "61363b2fbb08af548968fd3bef7e529f5f1a15d59d8c36732c9a430488d4d2ff", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ecfacbd7e8e994b8e1ca0db698eb1226a9f0cdecd0bc4dcaee71466d7fa237b3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cb37329f298bade2c13b44af8e8036f83bdda812f2acca9eead754340be8d829", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "13d7c23ac9137d74bd2614020c8d8c585f3fb9ae30d53d8a120a1abe168d47d0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_global/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2e8be33a4b8c4f6ed1238e648834c66b382d5d0c9638b2aaa15d23e5433e181e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f53f0ae420b815a40999516a0df43dbf6be6478362d4fd00f938647cd31ea997", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6d01e053990d738bcb911756ab9be2a7659b592d0841d98a1efbe9f4abb2528c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "73c669fdf692d5f7f3b578f6a4a46f8b0fff6d62da0f62ad903648405e9934dc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c711ecfe5d02de94fed82b58d3402e733c1e575fea60c3f9744f3379b01d1b33", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e10f178b46e0a654204ab75a7487641c6345c51592481e64d7c7d5d15317ac67", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0e5f55128df4f7326db45dfc8c478e59a39d68053caf563625473079580d6838", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7576f665b34ce43ec4245fd5765611aa031ffbf73096d9f8907b7e5a9f537c52", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8fbe99406870ccff9922c49a2ae193a563edcfb51cd7a4e2797181d1a3edf3ec", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2a49e3976aa794644e2cb1ed765367a39ad81b39a42c16bca3bf32c8043dc9b1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "23e7bceb1fd85748923512e2facfaf4cb2727570be530b30897febd6c79f2a1a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b4f0aac4ed1a3d18ee04a35d42b989ee6a3e2a8ad07ee8b98f56f275b027e826", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "670d9e454375f4479720d7a70e5099afd23319aa52bf2d01ba9b916ffd385d8e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_lldp_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "61c502d64492d3127c5503a4c6180c49d6bfba16ce0b4db6d37f5547b8bed58c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6cec8117492a3110c2e9066aa77a54abd2b9774cea08d60eb42b01c51c3e032", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tests/cli/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a007ba121e4852763d37a3f6c644aa9eb28771279d1190aadcf77eb97675c5a4", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging/tests/eapi/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90cbadb226481ddfba8e6981076e1d859499316b2c4018afea81607d469cd0ee", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0637d1b53afb46a8eec79f5c0763905f7f7c182db42f823402261479d71fae15", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1340381f48cc0d4caa0403bbab7b72de9484ba5fb9efa952068ef9af8234e596", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b2770a4c9d78449e45cb039ca95cc66215d4b5fca8aeca52e28280daacb29ee5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "653a99b2d157d5894d94aacc19083fc14c76b23077a390c15c6c6ef57aea62f5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c490f97548080abda0e8ebf836466a8a6bde8787bc433c6223ba3d59fd42170", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "61de4747e7132e7d8e54ec9eb6443f26e2896927739607b0dc6074d5369beae3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f7ae7444cf6cc04a2541fabd62ec1667d165cb39ce0b7d171f6efac9e4bd7638", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a3027ab685c832aec9f4b8cfa8e26cc8589f25f9fc802b246d3935ab7f1206c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5776e2445ac71c922c12d4f1a1aa667a2c824a3e4e6653bbe6f834a1da2dec19", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "108321fdfd99cdb6ff1b98da4741aa931453d409480f06c8c9af67e1aaae93e9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "04ab08225d0e0b263fb06ebafa021ee73c6117852c370d5266d36a5c13fff449", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_logging_global/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c2b71c8e8843f1fa24e2f0bafd6c1bd7880c076e0f5ded8086f8ac71f46955d6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "db6ca3b0768262fced3ee97dd2e9b9b9f6085d81047770a3883c7b65973d51dc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "db6ca3b0768262fced3ee97dd2e9b9b9f6085d81047770a3883c7b65973d51dc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "930ade9d4163376aae340574caca0dbcb60880eaabc6836d7357898b325a670c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "80a3c218ee8aaefd8e3fccc016b73adede17f646b5cb7aeb92930b2ebf240e08", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "65f05f9b573112dd4035eadd0ef4c037794e2c2d8575a9e57bce3363f9251e9d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "db285e5dba7f6690073a06d6fa2c71df3f551c1df280f25fc99a690c96b74053", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ad9aa73641fa04cef01184edad25e66075435e1190f1fd8dd6b35bf9a3da968d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "42c31c2540456a34184d4bab9fc456c8ac86f151e3fe42609f6acfac96638eeb", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8ad00ff561ee93d06eabfc81bfdd27c78dd622a1f9776da62893eb6a219fa338", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "425b9069cbfe0e6daec1d28d3023f886464df76571975acfa14d43285eab3dd5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d755dec987689bb90c08d6864899ad17b02cc78e78ec8126d1ff75897f7aea77", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ntp_global/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "abc053514dddfaa3eb54034ff9f04c8481b9b7ce6071dee44a2056f3a98685ee", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e2d645f551982b7ea8613b5d94260428dbcd4cd3207d34a4bb51fb8722b0ffc4", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b5c505431c56a3bd030ee52a85e240626c905bfe2809aab18a2e761066e0ccbb", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f61d79526410667fe97aa0c1fa0c6a0162e500c6abc373d025165382643b96a4", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4f997c36cc9170f11226c5057f8a2a6b9da5717306c07a8dcfae8517d9b4152d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9086ad58ff3a415a829921047e1c805e34d6ae95488b9b1c937b20a922ae964", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c607da23362194cb7a396214a601408e7ea7b78e895567b6a070205916f4677", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/gathered_empty_config.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f6ff5c23745f6f182db2a1173cd25b5a98a29465a8bc37cae61678d8c577af23", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "698af51d7f6a6ced71a9415495684f30be35b26cb298b53e1de7792a3d857c18", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3389b2ec80e9dfa1b851de623ba7bf990b39240feebc9e3cb18dac87b85250e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3fd4657ae775a57bdcda3537eaafb956b979f0a1569c80583364e96f16e2f201", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c136e2d339db165c433d2b3bd05409e542892bb8a5a94f53737891fb082d16f8", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4222a5770d1b912a7ac71103749ff82d93dd903e769e87690471a59be0c7e988", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cb5f91b025aa37891756c22bfae165a560c4c00bcee7f0d93005ddc79944886e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospf_interfaces/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bd015c6e2a8c0de8c44a813c8d30a6554cb1f7dec683760cd30a899ce85481c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a50326c21eba1d983db933b7a18c112f2aa7c5f16d574dc908095d9258b1cdb3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "efe02afcb1c79bf68872562eb02977725e731dfbe7536b270e0273e2766a6521", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0c38f23b440f4e2e1c0024d0c3e828cabea8b77cb08245223e9d1bd041824f55", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ebe46cf49f8af67c8cfe104d7c6e943b0280e000755907f8e718a035c9a622db", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2a7cd3925d54d03101a02b74c8b75fbf36fc335d3e53202ec6645f4b133f9cff", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "63faa553716754def756ba24e2a6f899177afdad432eb183b788390d219e1901", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9e40c2f4be5c39a0bf44fc386944705e5fe6af989b7b2eab6ca282f7fb183a5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3e4c4999c892bdb9fca72e568774b2c986d7bdfa8fa419c651767c6d4482d50", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e8a3b87032a207d23558a38cd9b6dc25ec6af9ed0e9bc6b41725619fb0f180d0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b7d761b36741b02edb289d71aaeac703a09dd50044f06b7a22efb65c1debf4e9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e88142e55ffbbe41f70ee83358da99cd518becb3ff0901f786bb4d56cc098d30", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv2/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c7cc18f6491766c65c2c46d595e731de7a188f6c8a4d85a511193825761fc5c1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96b764ff7795f328d12684eb2dd1aa60ea1e4d6d5d3e6ed638273aa7deb25686", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96b764ff7795f328d12684eb2dd1aa60ea1e4d6d5d3e6ed638273aa7deb25686", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "772202a71a3c35454372ee3e7d0a8bc98615b619f4cc37ebf1bc20ac7d5d55bf", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "18a10808206e727ecffe9b9714974da7d6c95edacd2758b0dd75d207fd6539d2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dc8f776fa74a50716d8a0194c5a56a51305991e4295186c2f011afe0cd89a87a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ef28a5797b256528edd1bff83509babe07944218468f22f9bdeeef905b52a4b2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ccb7da45bb920569021036a8ad9757cd020f0012686b5d073f29f9621f7471e1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "704e3f910ea6a5ef1cab48ec4bbea46955189e811124fa2c1a8dce9a0efb6a17", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c5780138500b761a2832d155ea8a30d7e78fa10a02ab581125af875994bb45c8", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "db343d29422b68984563c86904ac0ad79845853240e757cc26248b267f8e6f11", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c53dc625cf760dec12686ef99081361defb9dbbfaf9f6ce2d6d00cd6b0eda97a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d5a2e7460ef5bb7f6647ee5902bb0e4a9322beec5011a3c84d47804f5ffed7e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_ospfv3/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9917e16f0a7a0b7484fe0780a79f0b22180b634ad091fee3f94946946d87e030", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f41196dd12570c02dff69372f0539ac676553a8c97da1637db552399aa691fcd", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f41196dd12570c02dff69372f0539ac676553a8c97da1637db552399aa691fcd", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8184f88e334762f387e4baa6b3ab70c3c160a75c861d669a89b1f2940fa0b501", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5789eb8ee641ebf96faa3beaba1360916812f0b72bf79005dacf09038224eb1b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1246641c583926029ffa31cf7d9f68a5a3b5d9b6c3426323965a7ace18308646", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "75d1ef4096be7283925fda58180d9f70f9bbb42cc023228ee6bf69aab00052c8", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eee19a016590fc436d8be49414f1f5bd60598eac308df3f1581ec52677c6db1a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2481891014a0b474f98bbf7691a95628da7c0897b3ee4fc8046cbc79e0f54c75", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "40293ea4167e097760e7aeb5b43e229510ef4eefe55161f18756aea2410aca32", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "412ce27b1e535cfda5876456c2355d78a394ef0db13ba99c334f632732efb388", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "40b71ec679a26a406e66f31dc4b561a0671ffc493ead69d80c60d7a58a8bb871", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4b607978c8e64316d6196fa19665a85a0eadbf919ccb8875644857cf9b328407", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_prefix_lists/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fbdeab37387d1fd29e31ca469d49a5297e3fe095e30c0a02dd0f402a7bfe87a7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c74494f69023cfc97d41e81575736420b6f29e2d384b0e7f8f41c446ffdc603a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "64a5a2e160aff448bb567d8d4fdba4c3231f85ab0b44e2f596fe2784148e8554", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cdabf064aef1475c5f3ca82c999bf1b31e113c0dc8e8c23c043b792d4ea0d6f1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "28c7426a5b17a56f3b95701a57e71358f555978f8411340e51b098932fbe5bc4", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a089af65191e7c43d545eca51f782b7d202e2cb2d56494bface34b020cb45666", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "15d0e603090321cfdddd64967bc56c26dfb3003af6930743aa03bc6171ff0a3f", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a43b4966005a8a7ff89e03d834bdafcc7bca6d64de605c312d06bce503883af5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "79312d821332f81704323f4a81c7a25bc6028b81da83946485016d95669068d7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "351d48443390baf9e5ba8e9b8856931bb61b2dfa4b78ad8c1096ca9f02a1c663", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ef67fa3a5f7c2e93109b6fe7a8241945ba90f239fab62d805af4229984ffd5d0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "44f4351a9b5d2fe29f5ceb7b8da5353d19e68a3ee410ed12f362f8ae419faf42", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "60cc6ccf0b2663bfb35b98686d984c74580676ff0f846553237213ea77df4177", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_route_maps/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d337f562d76680d2b85d2144b4897034f37423f7f160a16e9c9ea66cc41f0f50", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6cec8117492a3110c2e9066aa77a54abd2b9774cea08d60eb42b01c51c3e032", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "127eb0878df69b7450386b07fcc8cb8a9582ac42fa9bed00c23a4b86da8d94fa", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/cli/caching.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ea530ff631421e3a7a074f77dcaf5b511a4020d80f609a967362c7708b910c01", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/cli/common_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8c0c76c10792321352005faed0ae9c51f1387f4964f2175e9a8e39af1c444ca1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/cli/common_utils.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "16ff2cbec75c329d7ffaeff96467873aae0b48e203e9013b5643fc47af5d47aa", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/cli/misc_tests.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8d12a8d25e86ab4cb05fbb567d3e602da96ccf9c7249a92d4e7b00175242085e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/cli/reboot.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f89bcad9703169bbc45f7cb7a306b81666f9ac935a912a144da191470dcf1102", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/eapi/common_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8c0c76c10792321352005faed0ae9c51f1387f4964f2175e9a8e39af1c444ca1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_smoke/tests/eapi/common_utils.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a18fa7aed51409b4944aada8a31a413f1058fda4ca0e652f55296166b6c5a253", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d8c084f757657a7a323a0fd6c49fef789d8ef373f770fb46f864563bc23c4ef", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/templates/populate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "955317964226d2639660f6006be99a9c1d67e3a8dcea25ba7b2c4a569059a4f9", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "90b472eb859697c791cb385ea0972ab042ffe3af2afedd902bf780cbd29ceac7", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dccc5998d088e1918f8022c69860a4b490af97d164b7beaaf04054824b0340b6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "49411b2c85202029944048c9b98c93755510c85f9912a6de5c31987bd5fb199d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e15abd88634fd0d4e37994033dbad069c4c6a5a74032fbdcb28054fd2ce24f50", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "03a12bd881dbe8be8c2a60638c8f2e564cc0b176ea9764af6a17d015098c8ac0", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92b980a2b2ec6624a2d10d807e8026953ec336d0c8f56ee070d27b0b8cd66ed6", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7de001d983e8873496684af8bbd816f668626f0cb61280f1e0d07326af32bdda", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a65a37d14b4764392ea5d9ccfa3debe6b1bfdcb5f4501477a51714f1f38eeefa", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fd35e88f8ab1a36691e324cf1c5e98721a41035cc9ef210966b4f744869fbd17", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c058c00472d829b53fb556f986cb2fbf9943b02212719a676530c1ca1ef3864e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5498af2763ccdc85790108ce60fec119ee9ee184694ab4dbb73bcc84411931a2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_snmp_server/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ae7da77e7cf9b6b97d3b5f42e00cb9f2ab4b591724f14421ce31ecaa491a410a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4df3d87f73db3368744f45083b9b822543ce447d77a6167922de9c3cc3908909", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/_populate.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c1986157b288504efba9959764aa6b8de99c79007f97a59c48e6ad72a496535", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/_remove_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dbd2727c4906cba6e945896b24be521129405364dab6c4444652c2804f91a8ee", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6022c467edbcead6301a2203a755a2ab12fe648877cb77cdc2ab32f5d0cf6581", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f8d6eb37916d612ff4b460b42cb1f8689420f1607695d867bf5a1ea7505bf64a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9ab33deec36ea6b8eea7be1b6eafb943f360759fe3b3e5c78211a9ab6cda58f3", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c93a2f5e26cee3ca747d7dacfb5233adb9c1448b72c54119fd32dce25988f0b8", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bec9055d452548f078aec3418ef1d147865a0b03c739b9a8cb7609142959736c", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7efefbf1285c5fc94d42b155d5e3236241aea41a49727bf31e0d27710209a2e2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "08eaf829db084d4878287253871d6dde4d9027f179af071ba0b501eb474791bf", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_static_routes/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2c42048158fb304b5951f30de6ce718b723ff26659c2f1ece7f577612f557675", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/cli/set_domain_list.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "382aace82bf0f7d0a09ba8f2a35a825bf9085cdca7d62d507096e65e361b6922", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/cli/set_domain_name.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "96a436ed7ba93da80b30b7fde2babbd14d77e20c888843f12fbd37f368774c05", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/cli/set_hostname.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3ddfe22c80b9e909d2cafe93380715fc7d695425a4bf23c0c549bbb1414fc8dc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/cli/set_lookup_source.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9b571561204978b797cde9c09803bd0f35e3a4b1d0f032d549b0d8a479bb7742", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/cli/set_name_servers.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a6511f53c7475d55b01bd0fd150ecc8432e6a237a0634b9f7d0dab26473d88b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/eapi", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/eapi/set_domain_list.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c864953ce83d0099b4f025894c10d502d1ecff22776b89688f784bf172b4f936", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/eapi/set_domain_name.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8cfd63ce023b45928d446783ffcd516e4ab736187d36102514859dd9aabcec05", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/eapi/set_hostname.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6bce01fac4d41bba5dc1495d183f86d153fbd010a3b1ac760bd07c32bcd3c5f2", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/eapi/set_lookup_source.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5ec0cefc6ecaf3e422116a57b7a77dac7c7e8de65543b445baaa5b08bb0c31a1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_system/tests/eapi/set_name_servers.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3f151be120cd9e6e74b1778bf682f08879753fc2198c807e4ecebe4486d21c28", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b6cec8117492a3110c2e9066aa77a54abd2b9774cea08d60eb42b01c51c3e032", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b14bb0d83e5f509721d34f537bb0812798e5b3d3ad6794f1cb7314c8a419202", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tests/cli/auth.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ece4746e3d18508426ba2ab784a91bed28670217a75be85b234b03ebb66dfd89", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_user/tests/cli/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "432c95aa920b1774308ea58ea6159647675bb2f7f1cffde182c64662dcc857fc", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9894ee154c7a39aa7a1e65d027dfc12b8643e1a3df53d3c09bbab9eeb44a1cf1", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a37cc29ff691d020e7eddf204f7250275beee4a4c9d28d30b47981eabdaa6281", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tasks/eapi.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2833f074f91eb14f89df2cf60665de978c3504c2b340b5729edeaac0ead3df5d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d5cf7fcbac079abb6f5cb6c649a9d27fe838821be84e54b51d4f35f98e64aa6e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/_parsed.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "24f8e0b4cb5d9b1444c92f7260088952ba7aa9a71949521dd331f5a434686783", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/_reset_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "31618630d4e82bffcf3ca7a4b12b835bb1b3bdf67d518eac68f72bb26b0d6924", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/deleted.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d4df0e51ef94b5a4ef06900a79bd20e79f84a964710a14de559368071f405669", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/empty_config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cdf7d6ea7f6f5c2ad9065b1b13e04198c38882991e60197c5c569fa6dce0d98d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/gathered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6512281e2fd290fd40f8f18191e72c127c2e3df9537c05559ecb25aed09ee4bb", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/idempotent.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c41bbf0a4522e6f01b3e38067c543afb71b21fcbfa0a8ededd26d0683e50a81d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/merged.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fab8447a90775e038817655f20e15623512f87e042c86c7f93c6f5fe902aa37e", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/overridden.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "23f1318af4e38f802c10ac90ec7cce6573c0eac7665773f877059bcb90426bee", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/parsed.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "97d8e342f7bee82d8027e115e1f5165d4a68e898b83813a2f710833e5fee4a33", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/rendered.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fb1e1d667d069e7d04de886871344ca9fc0a0bded7b3c2a7437a4d95b95dd05d", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/replaced.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8a2ed31515941cfc98d86db63eed394b71c6e749b8ef7a7433f5d3ff518f585a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/tests/common/rtt.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d33a3d3ddf38335484012ddc3a995f050d899f1f5686fae5e8ae88f8686f9d5b", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vlans/vars/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "361a49c0e4e03684a6718513ec6a800c844d872b6dba61efdb68249d61b34124", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/defaults/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "665288590cd4226da42511817f09ccdfc92df36c9621583cd2c82919af295c5a", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d3b5d25c408cac682eb405cfc386cedbf17e6480d46e83bba18c91fcfe5d6e48", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/tasks/cli.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6788027c858762808079ce3f9cec195264aebb130bf132dfec6ff2fcfeb025c5", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/tasks/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8e0a1de7edebf8e1de1b1bd68c83fa3e6669085f9cd28e417cbb11f43da75068", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/tests/cli", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/tests/cli/basic.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cea011f04a3c8f2d06c412f8512259c89a2e3a57b55effeef99fa45434d9be15", + "format": 1 + }, + { + "name": "tests/integration/targets/eos_vrf/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_eos_tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_eos_tests/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_eos_tests/meta/main.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "851860fe2ed1258710d7fcf89ac5b7d8c3c87755e89ca56fdd79bea022eb2b92", + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_eos_tests/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/prepare_eos_tests/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c53c149ac2c5c508711c2414d406b033110276eb4622949358a6e1efcf3cd505", + "format": 1 + }, + { + "name": "tests/integration/network-integration.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d67b11263a8f50b30bf43c7c2b4bdd8dc4f173f0b5dd22761311360dfbd56a1d", + "format": 1 + }, + { + "name": "tests/integration/target-prefixes.network", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ec96e8ef2e9e3856cae9bbefb51f64492bd044f17d17310cc560ec990ab14468", + "format": 1 + }, + { + "name": "tests/sanity", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.10.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c9647b2dee513f57df36fee1897a54856aeba3b5fed24f2b7d6612b225ead63", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.11.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c9647b2dee513f57df36fee1897a54856aeba3b5fed24f2b7d6612b225ead63", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.12.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7c9647b2dee513f57df36fee1897a54856aeba3b5fed24f2b7d6612b225ead63", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.13.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eef9f110ac24f19f2bd0d195d6ab988d986929ea42f869864ba19a025c882e40", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.14.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eef9f110ac24f19f2bd0d195d6ab988d986929ea42f869864ba19a025c882e40", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.15.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eef9f110ac24f19f2bd0d195d6ab988d986929ea42f869864ba19a025c882e40", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.16.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eef9f110ac24f19f2bd0d195d6ab988d986929ea42f869864ba19a025c882e40", + "format": 1 + }, + { + "name": "tests/sanity/ignore-2.9.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8c562d6941e7798adfb9f88ff0791f32d9e867dcd22292a4d8041c32585285a1", + "format": 1 + }, + { + "name": "tests/unit", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/compat", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/compat/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/compat/mock.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a4e0ca26e6e2982bc40db782db3a0d4950e8c5a749171c0da22c27c85acd23ea", + "format": 1 + }, + { + "name": "tests/unit/compat/unittest.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "727203a3846be41893b78a4b77852a1658925e936fb19539551958a5d8e8fb81", + "format": 1 + }, + { + "name": "tests/unit/mock", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/mock/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/mock/loader.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eb9c726ece54d3b6a06312634380e1893a8ca735928c31fae9d3ae67f6b94360", + "format": 1 + }, + { + "name": "tests/unit/mock/path.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "44b6e5b20c52ab9f4f57eaf79948d7ce9b6fa0546ae7d103abaa3bbfa66c5f19", + "format": 1 + }, + { + "name": "tests/unit/mock/procenv.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d0f54fd298f7888bfada6f867ee0f883f776a368916410abe2e5d31b8d17faec", + "format": 1 + }, + { + "name": "tests/unit/mock/vault_helper.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "55bd0e924dcc22d050612c944bff0ef745e51faac9260dce9b9b2018c4c8a661", + "format": 1 + }, + { + "name": "tests/unit/mock/yaml_helper.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4a53ccdcc1d312b032c6b169b1b4f907cc8d4e1fcf77bff5282d458e323ad40c", + "format": 1 + }, + { + "name": "tests/unit/modules", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_acl_interfaces_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "29bdd16b7032ccf6dd42d4c2e78ebe00aaaf155ea7f5d9049c638f742478f312", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_acls_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c58fb25414acf3b04a882b8172c4c048c637b5906670a1c3a5f36e8a3aad0380", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_banner_show_banner.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dc2e6349862de27bfb1d50da78684b7b6320c6c8626a7ae378ce07852d64f984", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_bgp_af_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9cfca9294069868122bcad8e9a7bcfdfd6101949fd9959ec32766b682f635a68", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_bgp_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7011ff501cdde31949153491b1f1092e8d8afa6a27510ab594deb1504403c2d0", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_bgp_global_af_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dd5318703b4822b5a27eb24bb0d1898c7e5559e96151114784e5a5e92d07f535", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_bgp_global_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3cef54b0f53689ccdd9a9de7e3d23fa7fa591582506b438f1b628752b5b0847b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_command_show_version.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "cd0ee8985d66e4cff1ebeff617108414d701cdb2acebf9327329f62e093f7062", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_config_candidate.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3352c8002ead9454c96fa97e82bc2bf245ac57a69edbf8a934bed4ef809de3de", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_config_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "03abdcaedc2f739a12fd1c31f37164f02ed471aff024ad8e654a0d7ec3e611e6", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_config_config_updated.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "199f6fddff67988e4e15efde118949a06623ac6cda6cc56a43110fab3da655d9", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_eapi_show_mgmt.json", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "963dde77e29e22955f66b6d4a4d880c327419e3c719556219b19cf2d9d515c07", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_eapi_show_mgmt_unconfigured.json", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "09f3bdc48ce35e7200a5a5da2f2722dff46de4bd8ebc1d1718fa4ed7a08310df", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_eapi_show_vrf.text", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a43e222ce4d0e6aec92afabb2d5ff7f6cc7fd96ce4e055b6ffc02ad1492373d5", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_hostname_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "55cfe4746ef24943eac865d5b0fd9b6a6884e0e529983e253d5764175c01c6e9", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_interfaces_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "05edee2806d57e1a907026a24ea0fd51582008c1d24b63c5fc1463e86204683e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_l2_interfaces_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "501ad2cead9d2a90aa7529319befbf62a4f58f7988995788c5206c90fbec5afc", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_l3_interfaces_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0989f0ad8aea46b6b4b7111aee264687387c44e8cc68154f8d9c054d22581d1d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_lacp_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5a89a5f03e68185c4a50f5410ea4fb04caca756685c8d906c1b4558fa52896aa", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_lacp_interfaces_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "414cc25eb0be567529b328993c191ea1f282c2620ff5f45b57462ec7e950ddca", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_lag_interfaces_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "996743ab19a23f6fbb30754d1f4beb2911c6b4ffa69a28665dfc79b5ad519b65", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_lldp_global_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "41eb838c679e2fd974f15bd92461a1627b29a0f2b8b1c5a5c3fef8a472efaad3", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_logging_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d35c0e1702f10694008ce77f2d405c569d3745738fa4ceab306cdb638f5b465d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_logging_global_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "616869cf79f4faf6f64276e039fbcad728d3e012eba2073b118b0296d9334013", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_ntp_global_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1c841ab014af5105c26d977cfcac4de50919a8537bf632698f95e5ea5f2b5c0b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_ospf_interfaces_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2c664a8713d7ccd543333cca425528c1726d6790b8364bdd6a5e8720ce4183be", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_ospfv2_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c4e0126af072bca2ca99eb356d26868e44adae27ffa3622f54fc431122e66ace", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_ospfv2_config_gather.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6271cc911105743891d46bde906d969ad2ce562d8bfa9364d845da33cb9c3bde", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_ospfv3_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "97763a63f53b38b8c864ed38f800e4270d600065cdd4acde805c3b1ca384e6b5", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_ospfv3_config_gather.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "091b340fe2578196b84cd9b133d0cc01e479a27a12caeb2a796355c571a39cb4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_prefix_lists_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ed6dda06d2158651429f03d9db644514e20f89e6d3c58331fc09e059c76a22ff", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_route_maps_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "64a5a2e160aff448bb567d8d4fdba4c3231f85ab0b44e2f596fe2784148e8554", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_snmp_server_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "955317964226d2639660f6006be99a9c1d67e3a8dcea25ba7b2c4a569059a4f9", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_static_routes_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9de7fbc93c152431ec2baf2f7c8ba736ced12148e8bff2e7b54eb7dd39c4b04d", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_static_routes_config1.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "22d8eb393f411a1034b6d77b5137ca205b1d01b09a6488c5c30199145b99bf7c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_system_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d1cb12a14186402c703d639d484b7ea9829e52f9159afac4f7779bd396f5e43f", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_user_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2b11830bd90b2c0e492cba03f0af73a5229a4723e47959812544961bde1ac438", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/fixtures/eos_vlan_config.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6e71249b2afca7c80191a77d86753e21419042d51d570de0b3c717a204f01400", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/eos_module.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b3f4714ae9af0063ed76f955c15e8492b3f7d69ecc52b3c1e139f49f2a0ea4d4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_acl_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d994b6dc95bca9c627aa1d0425ebdf92fd7f6b0fd311bb0052daf4f616716369", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_acls.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ef2b0e2e0e92773bf4676e43a11e4d040934b59d91b67a79f494e17ed0287d2b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_banner.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f833982a49df0e565b89e7ca46a3a6b4b812524378580f9df60f590f58d7b60c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_bgp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "46cf0755d9c960c529dc800d9d05a42491ab167c1a5308c0b7ae11f04e1c8715", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_bgp_address_family.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "25f46d0b577c21d95cf4d21c1a1a8e6b6c690469e0fb23185e8d6d72fd1d4158", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_bgp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "afa40c807d2ee150396019557201558d80e77cfdabb90210d0e32c79c2014096", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_command.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "586c52c5adacef2ed96dd1546a913f9998d2e52d3cc134766f408f873d94fee6", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_config.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f7f565aaab51bd7a0ecfc555509c22c485b9b8ab7cbead23b3828432082f1fe1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_eapi.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "84c7a8ca8fb966d268f7aa1a44e518f4dcff61dae8cba73f503e970e409d43a4", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_hostname.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "24e3e18b537ba189784edb7b402a6faa1101e169860928f37b3641587cb117b9", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "222c782d11eceacadb200678f6164d4496d23c3ecffbfe3c2f9761d0f7837ce1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_l2_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "70972d0f6da11306a150b2e7b78dda5d4f0f0579902611cc01fba66a09ed77c1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_l3_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "663fb58128ddb7e05cb1f793b36aa03335c02cface4d7f6b63a9db16eaf8364a", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_lacp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "54032b3980447e29f5ffc191c27edca4c564c47aa02fce2bb92d4499c673fae2", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_lacp_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "93ef8604e3a09a469f6ee10751e59e53aa1291f36e40f637b235345100da99d1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_lag_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4113ee99a61ea506d4baa3123e849d1c43055d64f8a027887b09d60f0efab09c", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_lldp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a8ef4c5a67a5502a4ff6862f2e7fb68df69852f753574e5005116ba1ffb6f86b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_logging.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d543db223f6bc7567f6631e5b41e559df779399c9e96b93d5eb1781b82066922", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_logging_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "33360d830b6806e4b1bf6d3eae4764c4042322a3cc500d5aec74c25a71ca4307", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_ntp_global.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "768e61e9134250652837a24db11a1d893074e3b68b3e9402df3a9a250c90337e", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_ospf_interfaces.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "69ff671801c47680e384822f474289eb1098db5a9c4eaaf15378d64c363e7b5f", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_ospfv2.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b9bd993556a3ae2d675a46e180cece4b8e108f9866f071d05cc8d4aa4ec226c1", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_ospfv3.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ea8493a9f1998dd1d406d4f57391c682f7795adb9369edf4fc94a9115a56f910", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_prefix_lists.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "449054bb06c96d99226eb42ef465d554d94bacf5800d2ac26d706475e49ae48a", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_route_maps.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "32ffeb2ed018e25bfc03e9e496208d03ef71a217951bae02130b0c9c985c83a5", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_snmp_server.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "39d30b82b200cf6221224ea99de06174e36e9fd5b479c3bffbd67d3c7817ae9b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_static_routes.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4f57b01e3490ef4d7d273748a6a09d0f0217d919a2987038ab4355bbab258dd6", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_system.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "78865d05e4d5f1bab0404f61d230d09c9986d926c3372944d907d97fdba9d228", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_user.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3e74bb8a59fe4adba89f1366d156230de88ce552815b322f25e4309c9ce5e96b", + "format": 1 + }, + { + "name": "tests/unit/modules/network/eos/test_eos_vlans.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b5a2b1ba6f53075bb642acfed593f6372b0975a964c55cce6fc6e972bc983b27", + "format": 1 + }, + { + "name": "tests/unit/modules/network/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/modules/conftest.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "98e43bdf758ecbcf12ee812a784753cc7eba40b49f37ce2d063a84db81bf2cb7", + "format": 1 + }, + { + "name": "tests/unit/modules/utils.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1e9c58b776c4d76cfc671ebfddb1a290a50af7dd0aa1b69b2ad1c5ae1b2545b7", + "format": 1 + }, + { + "name": "tests/unit/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "tests/unit/requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "49ba996dc4735c3463e9af561344346dfae14bcc1a68096ce78364b377f0df1f", + "format": 1 + }, + { + "name": "tests/.gitignore", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b5726d3ec9335a09c124469eca039523847a6b0f08a083efaefd002b83326600", + "format": 1 + }, + { + "name": ".gitignore", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a2ebfecdb6c1b58267fbe97e6e2ac02c2b963df7673fc1047270f0f0cff16732", + "format": 1 + }, + { + "name": ".isort.cfg", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0ac83124be8cf24f40e7457c3a7ede4409108ee8caa89976cdb03d6d1ae336d1", + "format": 1 + }, + { + "name": ".pre-commit-config.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "06bed67a59f58967c07847fd7de4ca8e4d8f246157db95a832132f3de2b94117", + "format": 1 + }, + { + "name": ".prettierignore", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "29d6205739f8fa2ea1dfb82777cc64dd269e51fe58c7c713682f71ac8b1973c4", + "format": 1 + }, + { + "name": ".yamllint", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "827ef9e031ecdcaf137be239d33ef93fcbbc3611cbb6b30b0e507d0e03373d0e", + "format": 1 + }, + { + "name": "CHANGELOG.rst", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ba340cded6c4bbc62e912ad34b5c38773c942d8d3ffb99902670b6240fe344ab", + "format": 1 + }, + { + "name": "LICENSE", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986", + "format": 1 + }, + { + "name": "README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4631de5e5e56e10da8eb1af60b837349a909ed012825913d38ec55efa0a4928d", + "format": 1 + }, + { + "name": "bindep.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2cb7d868bf5a674ff9531652c2f591c4767816c5ce240a75330c1585861e70b0", + "format": 1 + }, + { + "name": "ignore-2.9.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "434c723567b8bb4d59f1b64bdbf674e2869789650c878f84f08f3ebe93a97b60", + "format": 1 + }, + { + "name": "pyproject.toml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3ecb9ab9054afb7fb47aa660fa8df80964e13307972d715383b70d68c408630", + "format": 1 + }, + { + "name": "requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "883b106f13b0c6536f55619685ddca25968b4167dedb12e08fa37c93f4c63b25", + "format": 1 + }, + { + "name": "test-requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8939d1822e2de71cfb171b2571609e3dce15e38392e0135e68caa91ec9815460", + "format": 1 + }, + { + "name": "tox.ini", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fd158516483d5423739b759e071d502cfdcaa9337e01d5fb5bbf5a9495af1abf", + "format": 1 + } + ], + "format": 1 +} \ No newline at end of file diff --git a/ansible_collections/arista/eos/LICENSE b/ansible_collections/arista/eos/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/ansible_collections/arista/eos/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/ansible_collections/arista/eos/MANIFEST.json b/ansible_collections/arista/eos/MANIFEST.json new file mode 100644 index 000000000..21b4830da --- /dev/null +++ b/ansible_collections/arista/eos/MANIFEST.json @@ -0,0 +1,35 @@ +{ + "collection_info": { + "namespace": "arista", + "name": "eos", + "version": "6.0.1", + "authors": [ + "Ansible Network Community (ansible-network)" + ], + "readme": "README.md", + "tags": [ + "arista", + "eos", + "networking", + "eapi" + ], + "description": "Ansible Network Collection for Arista EOS devices.", + "license": [], + "license_file": "LICENSE", + "dependencies": { + "ansible.netcommon": ">=2.5.1" + }, + "repository": "https://github.com/ansible-collections/arista.eos", + "documentation": null, + "homepage": null, + "issues": "https://github.com/ansible-collections/arista.eos/issues" + }, + "file_manifest_file": { + "name": "FILES.json", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f00660da4e54818c505325ef264a6484161c78db27d6c0174488c386d70920b7", + "format": 1 + }, + "format": 1 +} \ No newline at end of file diff --git a/ansible_collections/arista/eos/README.md b/ansible_collections/arista/eos/README.md new file mode 100644 index 000000000..cacc361a5 --- /dev/null +++ b/ansible_collections/arista/eos/README.md @@ -0,0 +1,160 @@ + + +# Arista EOS Collection +[![CI](https://zuul-ci.org/gated.svg)](https://dashboard.zuul.ansible.com/t/ansible/project/github.com/ansible-collections/arista.eos) + +The Ansible Arista EOS collection includes a variety of Ansible content to help automate the management of Arista EOS network appliances. + +This collection has been tested against Arista EOS 4.24.6F. + + +## Ansible version compatibility + +This collection has been tested against following Ansible versions: **>=2.9.10**. + +For collections that support Ansible 2.9, please ensure you update your `network_os` to use the +fully qualified collection name (for example, `cisco.ios.ios`). +Plugins and modules within a collection may be tested with only specific Ansible versions. +A collection may contain metadata that identifies these versions. +PEP440 is the schema used to describe the versions of Ansible. + + +### Supported connections +The Arista EOS collection supports ``network_cli`` and ``httpapi`` connections. + +## Included content + + +### Cliconf plugins +Name | Description +--- | --- +[arista.eos.eos](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_cliconf.rst)|Use eos cliconf to run command on Arista EOS platform + +### Httpapi plugins +Name | Description +--- | --- +[arista.eos.eos](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_httpapi.rst)|Use eAPI to run command on eos platform + +### Modules +Name | Description +--- | --- +[arista.eos.eos_acl_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_acl_interfaces_module.rst)|ACL interfaces resource module +[arista.eos.eos_acls](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_acls_module.rst)|ACLs resource module +[arista.eos.eos_banner](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_banner_module.rst)|Manage multiline banners on Arista EOS devices +[arista.eos.eos_bgp](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_bgp_module.rst)|(deprecated, removed after 2023-01-29) Configure global BGP protocol settings on Arista EOS. +[arista.eos.eos_bgp_address_family](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_bgp_address_family_module.rst)|Manages BGP address family resource module +[arista.eos.eos_bgp_global](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_bgp_global_module.rst)|Manages BGP global resource module +[arista.eos.eos_command](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_command_module.rst)|Run arbitrary commands on an Arista EOS device +[arista.eos.eos_config](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_config_module.rst)|Manage Arista EOS configuration sections +[arista.eos.eos_eapi](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_eapi_module.rst)|Manage and configure Arista EOS eAPI. +[arista.eos.eos_facts](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_facts_module.rst)|Collect facts from remote devices running Arista EOS +[arista.eos.eos_hostname](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_hostname_module.rst)|Manages hostname resource module +[arista.eos.eos_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_interfaces_module.rst)|Interfaces resource module +[arista.eos.eos_l2_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_l2_interfaces_module.rst)|L2 interfaces resource module +[arista.eos.eos_l3_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_l3_interfaces_module.rst)|L3 interfaces resource module +[arista.eos.eos_lacp](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_lacp_module.rst)|LACP resource module +[arista.eos.eos_lacp_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_lacp_interfaces_module.rst)|LACP interfaces resource module +[arista.eos.eos_lag_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_lag_interfaces_module.rst)|LAG interfaces resource module +[arista.eos.eos_lldp](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_lldp_module.rst)|Manage LLDP configuration on Arista EOS network devices +[arista.eos.eos_lldp_global](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_lldp_global_module.rst)|LLDP resource module +[arista.eos.eos_lldp_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_lldp_interfaces_module.rst)|LLDP interfaces resource module +[arista.eos.eos_logging](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_logging_module.rst)|Manage logging on network devices +[arista.eos.eos_logging_global](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_logging_global_module.rst)|Manages logging resource module +[arista.eos.eos_ntp_global](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_ntp_global_module.rst)|Manages ntp resource module +[arista.eos.eos_ospf_interfaces](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_ospf_interfaces_module.rst)|OSPF Interfaces Resource Module. +[arista.eos.eos_ospfv2](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_ospfv2_module.rst)|OSPFv2 resource module +[arista.eos.eos_ospfv3](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_ospfv3_module.rst)|OSPFv3 resource module +[arista.eos.eos_prefix_lists](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_prefix_lists_module.rst)|Manages Prefix lists resource module +[arista.eos.eos_route_maps](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_route_maps_module.rst)|Manages Route Maps resource module +[arista.eos.eos_snmp_server](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_snmp_server_module.rst)|Manages snmp_server resource module +[arista.eos.eos_static_routes](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_static_routes_module.rst)|Static routes resource module +[arista.eos.eos_system](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_system_module.rst)|Manage the system attributes on Arista EOS devices +[arista.eos.eos_user](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_user_module.rst)|Manage the collection of local users on EOS devices +[arista.eos.eos_vlans](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_vlans_module.rst)|VLANs resource module +[arista.eos.eos_vrf](https://github.com/ansible-collections/arista.eos/blob/main/docs/arista.eos.eos_vrf_module.rst)|Manage VRFs on Arista EOS network devices + + + +Click the ``Content`` button to see the list of content included in this collection. + +## Installing this collection + +You can install the Arista EOS collection with the Ansible Galaxy CLI: + + ansible-galaxy collection install arista.eos + +You can also include it in a `requirements.yml` file and install it with `ansible-galaxy collection install -r requirements.yml`, using the format: + +```yaml +--- +collections: + - name: arista.eos +``` +## Using this collection + + +This collection includes [network resource modules](https://docs.ansible.com/ansible/latest/network/user_guide/network_resource_modules.html). + +### Using modules from the Arista EOS collection in your playbooks + +You can call modules by their Fully Qualified Collection Namespace (FQCN), such as `arista.eos.eos_l2_interfaces`. +The following example task replaces configuration changes in the existing configuration on a Arista EOS network device, using the FQCN: + +```yaml +--- + - name: Replace device configuration of specified L2 interfaces with provided configuration. + arista.eos.eos_l2_interfaces: + config: + - name: Ethernet1 + trunk: + native_vlan: 20 + trunk_vlans: 5-10, 15 + state: replaced +``` + +**NOTE**: For Ansible 2.9, you may not see deprecation warnings when you run your playbooks with this collection. Use this documentation to track when a module is deprecated. + +### See Also: + +* [Arista EOS Platform Options](https://docs.ansible.com/ansible/latest/network/user_guide/platform_eos.html) +* [Ansible Using collections](https://docs.ansible.com/ansible/latest/user_guide/collections_using.html) for more details. + +## Contributing to this collection + +We welcome community contributions to this collection. If you find problems, please open an issue or create a PR against the [Arista EOS collection repository](https://github.com/ansible-collections/arista.eos). See [Contributing to Ansible-maintained collections](https://docs.ansible.com/ansible/devel/community/contributing_maintained_collections.html#contributing-maintained-collections) for complete details. + +You can also join us on: + +- IRC - the ``#ansible-network`` [irc.libera.chat](https://libera.chat/) channel +- Slack - https://ansiblenetwork.slack.com + +See the [Ansible Community Guide](https://docs.ansible.com/ansible/latest/community/index.html) for details on contributing to Ansible. + +### Code of Conduct +This collection follows the Ansible project's +[Code of Conduct](https://docs.ansible.com/ansible/devel/community/code_of_conduct.html). +Please read and familiarize yourself with this document. + +## Changelogs + +## Release notes + +Release notes are available [here](https://github.com/ansible-collections/arista.eos/blob/main/CHANGELOG.rst). + +## Roadmap + + + +## More information + +- [Ansible network resources](https://docs.ansible.com/ansible/latest/network/getting_started/network_resources.html) +- [Ansible Collection overview](https://github.com/ansible-collections/overview) +- [Ansible User guide](https://docs.ansible.com/ansible/latest/user_guide/index.html) +- [Ansible Developer guide](https://docs.ansible.com/ansible/latest/dev_guide/index.html) +- [Ansible Community code of conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html) + +## Licensing + +GNU General Public License v3.0 or later. + +See [LICENSE](https://www.gnu.org/licenses/gpl-3.0.txt) to see the full text. diff --git a/ansible_collections/arista/eos/bindep.txt b/ansible_collections/arista/eos/bindep.txt new file mode 100644 index 000000000..af39ab0cf --- /dev/null +++ b/ansible_collections/arista/eos/bindep.txt @@ -0,0 +1,9 @@ +# This is a cross-platform list tracking distribution packages needed by tests; +# see https://docs.openstack.org/infra/bindep/ for additional information. + +gcc-c++ [doc test platform:rpm] +python3-devel [test platform:rpm] +python3 [test platform:rpm] +libssh-devel [test platform:rpm] +libffi-devel [test platform:rpm] +openssl-devel [test platform:rpm] diff --git a/ansible_collections/arista/eos/changelogs/changelog.yaml b/ansible_collections/arista/eos/changelogs/changelog.yaml new file mode 100644 index 000000000..48cc60726 --- /dev/null +++ b/ansible_collections/arista/eos/changelogs/changelog.yaml @@ -0,0 +1,509 @@ +ancestor: null +releases: + 1.0.0: + modules: + - description: ACL interfaces resource module + name: eos_acl_interfaces + namespace: "" + - description: ACLs resource module + name: eos_acls + namespace: "" + - description: Manage multiline banners on Arista EOS devices + name: eos_banner + namespace: "" + - description: + (deprecated, removed after 2023-01-29) Configure global BGP protocol + settings on Arista EOS. + name: eos_bgp + namespace: "" + - description: Run arbitrary commands on an Arista EOS device + name: eos_command + namespace: "" + - description: Manage Arista EOS configuration sections + name: eos_config + namespace: "" + - description: Manage and configure Arista EOS eAPI. + name: eos_eapi + namespace: "" + - description: Collect facts from remote devices running Arista EOS + name: eos_facts + namespace: "" + - description: Interfaces resource module + name: eos_interfaces + namespace: "" + - description: L2 interfaces resource module + name: eos_l2_interfaces + namespace: "" + - description: L3 interfaces resource module + name: eos_l3_interfaces + namespace: "" + - description: LACP resource module + name: eos_lacp + namespace: "" + - description: LACP interfaces resource module + name: eos_lacp_interfaces + namespace: "" + - description: LAG interfaces resource module + name: eos_lag_interfaces + namespace: "" + - description: Manage LLDP configuration on Arista EOS network devices + name: eos_lldp + namespace: "" + - description: LLDP resource module + name: eos_lldp_global + namespace: "" + - description: LLDP interfaces resource module + name: eos_lldp_interfaces + namespace: "" + - description: Manage logging on network devices + name: eos_logging + namespace: "" + - description: OSPFv2 resource module + name: eos_ospfv2 + namespace: "" + - description: Static routes resource module + name: eos_static_routes + namespace: "" + - description: Manage the system attributes on Arista EOS devices + name: eos_system + namespace: "" + - description: Manage the collection of local users on EOS devices + name: eos_user + namespace: "" + - description: VLANs resource module + name: eos_vlans + namespace: "" + - description: Manage VRFs on Arista EOS network devices + name: eos_vrf + namespace: "" + plugins: + cliconf: + - description: Use eos cliconf to run command on Arista EOS platform + name: eos + namespace: null + httpapi: + - description: Use eAPI to run command on eos platform + name: eos + namespace: null + release_date: "2020-06-23" + 1.0.1: + changes: + bugfixes: + - Fixes mismatch in documentation and code for using eos_lag_interfaces where + the code required 'Port-Channel\d.*:' but the docs did not document this. + The module now supports both 'Port-Channel\d.*:' and '\d.*:'. + - Make `src`, `backup` and `backup_options` in eos_config work when module alias + is used (https://github.com/ansible-collections/arista.eos/pull/85). + minor_changes: + - Add round trip testcases to the 2.9 resource modules. + - Add unit testcases to the eos_l3_interfaces resource modules. + - Add unit testcases to the eos_lag_interfaces resource modules. + - Sorted the list of params of ip address before forming the tuple. + - Updated docs. + fragments: + - 68-fix-sort-l3-int.yaml + - 72-add-rtt.yaml + - 80-linkagg-name-parameter.yaml + - 89-add-ut-l3_interfaces.yaml + - 90-add-ut-lag-interfaces.yaml + - 93-update-docs.yaml + - fix_src_backup_with_module_alias.yaml + release_date: "2020-07-31" + 1.0.2: + fragments: + - 1.0.2.yaml + release_date: "2020-08-06" + 1.0.3: + changes: + bugfixes: + - Added error pattern to the terminal plugin to handle change mode error seen + in lag interfaces config. + fragments: + - 96-changemode-terminalerror.yaml + release_date: "2020-08-26" + 1.1.0: + changes: + bugfixes: + - Added 'mode' key to eos_interfaces to handle the layer2/3 switchport mode + of an interface. + - Added fix to maintain the idempotency while using overridden operation. + - Check for existing configuration when trunk_allowed_vlans is issued, is added. + - Fixed typo and index out of range errors while handling protocol_options. + (https://github.com/ansible-collections/arista.eos/pull/115) + minor_changes: + - Added 'mode' to examples in documentation of eos_l2_interfaces. + - Added eos ospfv3 resource module (https://github.com/ansible-collections/arista.eos/pull/109). + - Added unit test cases for eos_lldp_global module. + fragments: + - 105-switchport-mode-interfaces.yaml + - 106-lldp_global_unittest.yaml + - 109-eos-ospfv3-resource-module.yaml + - 113-add-mode-to-examples.yaml + - 115-protocol-options-acls.yaml + - 116-acls-overridden-idempotent.yaml + - 119-idempotent-l2-interfaces.yaml + modules: + - description: OSPFv3 resource module + name: eos_ospfv3 + namespace: "" + release_date: "2020-09-30" + 1.2.0: + changes: + bugfixes: + - updated config dict, with duplex key when speed changes from 'x' to 'forced + x' (https://github.com/ansible-collections/arista.eos/pull/120). + minor_changes: + - Added ospf_interfaces resource module. (https://github.com/ansible-collections/arista.eos/pull/125) + - Documented the necessity to use eos_interfaces and eos_l2_interfaces (for + l2 configs) in eos_l3_interfaces module. + - modify short description in ospfv3 resource module. + - stop integration testing of local connection as it is deprecated. + fragments: + - 101-l3_interfaces_documentation.yaml + - 120-forcedspeed-interfaces-config.yaml + - 123-ospfv3-description.yaml + - 125-ospf_interfaces_resource_module.yaml + - 127-drop-local-connection-testing.yaml + modules: + - description: OSPF Interfaces Resource Module. + name: eos_ospf_interfaces + namespace: "" + release_date: "2020-10-30" + 1.3.0: + changes: + bugfixes: + - Add version key to galaxy.yaml to work around ansible-galaxy bug + - Fix yaml formatting errors in documentation. + - Uncap required ansible version in our collection. + - Update default values in module argspec and docs (https://github.com/ansible-collections/arista.eos/pull/154). + - Update docs to clarify the idemptonecy releated caveat and add it in the output + warnings (https://github.com/ansible-collections/ansible.netcommon/pull/189) + - fixes eos interfaces rm where interface in description resulted in failure + (https://github.com/ansible-collections/arista.eos/issues/86). + - replace list.copy() with list[:] to support python 2.7 and fix idempotent + issue with replaced and overridden (https://github.com/ansible-collections/arista.eos/pull/142). + fragments: + - acls_idempotent_issue.yaml + - add_bgp_af_rm.yaml + - bgp_global_resource_module.yaml + - eos_config_diff_doc_update.yaml + - fixes_eos_interfaces_rm_where_interface_in_description_resulted_in_failure.yaml + - galaxy-version.yaml + - requires-ansible.yaml + - update_docs_default_values.yaml + modules: + - description: Manages BGP address family resource module + name: eos_bgp_address_family + namespace: "" + - description: Manages BGP global resource module + name: eos_bgp_global + namespace: "" + release_date: "2021-02-01" + 2.0.0: + changes: + bugfixes: + - Add 'virtual' key to denote the existence of virtual address on an interface.(https://github.com/ansible-collections/arista.eos/pull/170). + - Fixed the regex to parse the running config correctly.(https://github.com/ansible-collections/arista.eos/issues/150) + - cliconf plugin - Prevent `get_capabilities()` from getting larger every time + it is called + major_changes: + - Requires ansible.netcommon v2.0.0+ to support `ansible_network_single_user_mode` + and `ansible_network_import_modules` - Please refer to ansible.netcommon `changelog + `_ + for more details. + minor_changes: + - Add support for configuration caching (single_user_mode). + - Add support for syntax changes in ospf bfd command in 4.23 (https://github.com/ansible-collections/arista.eos/pull/134/) + - Move eos_config idempotent warning message with the task response under `warnings` + key if `changed` is `True` + - Re-use device_info dictionary in cliconf + fragments: + - acl_interfaces_parse_issue.yaml + - add_ignore_txt.yaml + - add_virtual_interface.yaml + - change_import_resoure_module.yaml + - config_module_warning_msg.yaml + - major_release_2.yaml + - ospf_bfd_command_syntax_4_23.yaml + - single_user_mode.yaml + - unbloat-rpc.yaml + release_date: "2021-02-24" + 2.0.1: + changes: + bugfixes: + - Add _remove_config before starting every integration test. + - galaxy.yml - change wrong dependency ``ansible.netcommon`` from ``2.0.0`` + to ``>= 2.0.0`` (https://github.com/ansible-collections/overview/issues/43). + fragments: + - 177-remove_tests_sanity_requirements.yml + - 183-check_required_if.yaml + - add_remove_config_integrationtests.yml + release_date: "2021-03-30" + 2.1.1: + changes: + bugfixes: + - Modify the split pattern while checking for eapi url in eos_eapi. + - Normalize interface name before any operaion. + - Skip when there are alpha values present following vlan keyword. + minor_changes: + - Add eos_route_maps resource module. + - Add support for available_network_resources key, which allows to fetch the + available resources for a platform (https://github.com/ansible-collections/arista.eos/issues/184). + security_fixes: + - Mask values of sensitive keys in module result. + fragments: + - 184_available_network_resources.yaml + - 196-fix-caching-test-failure.yaml + - 197-add_ignore_txt.yml + - 200-add-eos-route-maps.yaml + - l3_interfaces_normalize_interface_name.yml + - no_log_mask.yaml + - split_eapi_url.yml + - vlan_id_alpha_configs.yml + release_date: "2021-04-27" + 2.1.2: + changes: + bugfixes: + - Add support to accomodate change in username config cli in latest eos software + version. + - Fix regex for password prompt. + - argspec key 'shut_down' changed to 'shutdown'. + fragments: + - black.yaml + - changelog_doc_path_update.yaml + - fix_password_regex.yaml + - fix_typo_bgp_global.yaml + - sshkey_cli_change.yaml + release_date: "2021-05-18" + 2.2.0: + changes: + bugfixes: + - Add alias to neighbor and network in bgp_global so that lists of objects are + plural. + - Fix typo in eos_bgp_address_family redirection. + minor_changes: + - Add eos_prefix_lists resource module. + fragments: + - add-eos-prefix-lists.yaml + - add_aliases.yml + - fix_redirection_typo.yml + - update_readme.yml + modules: + - description: Manages Prefix lists resource module + name: eos_prefix_lists + namespace: "" + release_date: "2021-06-22" + 3.0.0: + changes: + breaking_changes: + - Arista released train 4.23.X and newer and along with it replaced and deprecated + lots of commands. This PR adds support for syntax changes in release train + 4.23 and after. Going forward the eos modules will not support eos sw version + < 4.23. + bugfixes: + - Added fix to support multiple keys under ip and ipv6 dict in parser template. + - fix issue in prefix_lists facts code when prefix_lists facts are empty. + - fix issue in route-maps facts code when route-maps facts are empty. + minor_changes: + - Add eos_logging_global resource module. + - Add new keys to vrf->route_target in bgp modules. + - Change cli 'bgp listen limit' to 'dynamic peer max' ( cli changes in eos 4.23 + ). + - Fix ospf3 to be ospfv3 in bgp config. + - Update BGP neighbor peer group syntax. + fragments: + - 225-safe-eval-no-concat.yml + - 230_empty_config_facts.yml + - add_keys_bgp_route_target.yml + - arguments-renamed-pylint-issue.yaml + - bgp_cli_change.yaml + - bgp_listen_limit_cli_change.yml + - bgp_peer_group_cli_change.yaml + - disable_integration_tests.yaml + - enable_interface_test.yaml + - eos_bgp_deprecation.yml + - eos_logging_global_module.yml + - pylint_upgrade_sanity_fix.yml + - remove_expected_config.yml + - remove_intent_testcase.yaml + - support_cli_syntax_change.yaml + - support_multiple_key_ip_dict_route_maps.yml + modules: + - description: Manages logging resource module + name: eos_logging_global + namespace: "" + release_date: "2021-08-27" + 3.1.0: + changes: + bugfixes: + - Changed access_group parameter to type list, to enable multiple access-groups + configuration. + - Fix logic error while executing replaced and overridden operations on bgp + neighbors. + - Fix typo and logic errors in bgp_global, to skip other routing protocol configs + from running-config. + - command template fixed supporting Jinja version for centos-8 EEs. + deprecated_features: + - Remove testing with provider for ansible-test integration jobs. This helps + prepare us to move to network-ee integration tests. + minor_changes: + - Add eos_ntp_global module. + fragments: + - bgp_global_access_group_list.yaml + - bgp_global_neighbor_replaced.yaml + - bgp_global_typo_fix.yaml + - cleanup_tags_for_tests.yaml + - deprecation_biannually.yaml + - eos_ntp_global_module.yaml + - remove_debug_from_tests.yaml + - remove_provider_from_tests.yaml + - set_allow_duplicates.yaml + - template_to_support_jinja2.10.3.yaml + modules: + - description: Manages ntp resource module + name: eos_ntp_global + namespace: "" + release_date: "2021-09-24" + 4.0.0: + changes: + breaking_changes: + - eos_command - new suboption ``version`` of parameter ``command``, which controls + the JSON response version. Previously the value was assumed to be "latest" + for network_cli and "1" for httpapi, but the default will now be "latest" + for both connections. This option is also available for use in modules making + their own device requests with ``plugins.module_utils.network.eos.eos.run_commands()`` + with the same new default behavior. (https://github.com/ansible-collections/arista.eos/pull/258). + minor_changes: + - Add eos_snmp_server resource module. + fragments: + - 0-copy_ignore_txt.yml + - 280-command-spec.yaml + - eos_snmp_server.yaml + - remove_2.6_ignores.yml + - support_version_parameter.yaml + modules: + - description: Manages snmp_server resource module + name: eos_snmp_server + namespace: "" + release_date: "2021-12-07" + 4.1.0: + changes: + bugfixes: + - eos_acls - fixes state replaced where new ACEs are not all added + minor_changes: + - Add eos_hostname resource module. + - eos_acls - Fix examples typos + fragments: + - 295-eos-acls-examples-fix.yaml + - 297-eos-acl-fix-replaced.yaml + - add_eos_hostname.yaml + modules: + - description: Manages hostname resource module + name: eos_hostname + namespace: "" + release_date: "2022-01-31" + 4.1.1: + changes: + bugfixes: + - Add check mode support to bgp_global and bgp_address_family + - Add logic to skip unwanted configs from running-config, to collect bgp af + facts. + - Fixed an invalid parameter used in example for eos_l2_interfaces + fragments: + - bgp_check_mode_support.yml + - fix_documentation_eos_l2_interfaces.yml + - skip_unwanted_configs_bgp_af.yaml + release_date: "2022-02-28" + 4.1.2: + changes: + bugfixes: + - Add symlink of modules under plugins/action. + - eos_bgp_global - Add alias for peer - neighbor_address + fragments: + - add_alias_bgp_global_peer.yaml + - add_symlink_redirection.yml + release_date: "2022-03-29" + 5.0.0: + changes: + breaking_changes: + - httpapi - the ``eos_use_sessions`` option is now a boolean instead of an integer. + bugfixes: + - Add and fix bgp_global neighbor parsers. + - Fix added to change snmp communities with or without acl. + - Fix parser to parse maximum-paths ecmp command correctly. + - arista.eos.eos_acls - fixed issue that would cause a key value error on `aces` + element when no ACEs exist in the access-list. + - arista.eos.eos_acls - fixed issue where protcol_options were rendered to command + line using the key _underscore_ value rather than the hyphen nominclature. + - httpapi - detect session support more robustly when ``eos_use_sessions`` is + not specified. + major_changes: + - Minimum required ansible.netcommon version is 2.5.1. + - Updated base plugin references to ansible.netcommon. + - "`eos_facts` - change default gather_subset to `min` from `!config` (https://github.com/ansible-collections/arista.eos/issues/306)." + fragments: + - 0-ignore.yml + - 346-httpapi.yaml + - add_bgp_global_neighor_bfd.yaml + - eos_facts_remove_warning.yaml + - eos_facts_update.yaml + - fix_bgp_global_ecmp_render.yaml + - fix_eos_acls_protocol_options.yml + - fix_snmp_server_communities.yaml + - netcommon_ref_update.yaml + release_date: "2022-04-26" + 5.0.1: + changes: + bugfixes: + - Add logic to add new interface using overridden. + - Automatiaclly named sessions (ansible_XXXXXXXXX) now use two digits of sub-second + precision (if available). This is to work around tasks reusing a session if + the previous task completed very quickly. + - Fix the logic to add new aces using replaced and overriden state. + - Normalize interface name from want before comaparing with the interface in + have. + - Normalize ntp server source interface. + fragments: + - fast_sessions.yaml + - fix_acls_replaced.yaml + - l3_interfaces_overridden_new_int.yaml + - normalize_ntp_server_source.yaml + - pre-commit.yaml + release_date: "2022-05-25" + 6.0.0: + changes: + major_changes: + - Remove following EOS dprecated modules + - "Use of connection: local and the provider option are no longer valid on any + modules in this collection." + - eos_interface + - eos_l2_interface + - eos_l3_interface + - eos_linkagg + - eos_static_route + - eos_vlan + minor_changes: + - Add support for setting encryption_password for BGP neighbors in bgp_global + module + - Add validate_config option to diff_against in eos_config + fragments: + - bgp_global_neighbor_password.yml + - diff_against_validate_config.yaml + - github_actions.yaml + - net_remove.yaml + - remove_deprecated_modules.yaml + - remove_provider.yaml + - sanity.yaml + release_date: "2022-10-13" + 6.0.1: + changes: + bugfixes: + - fix ntp_global authenticate config. + - https://github.com/ansible-collections/arista.eos/issues/399. + fragments: + - fix_linting_failures.yaml + - fix_ntp_global_authenticate.yaml + - rm_base.yaml + - sanity_fixes.yaml + - trivial_changes.yaml + release_date: "2023-04-10" diff --git a/ansible_collections/arista/eos/changelogs/config.yaml b/ansible_collections/arista/eos/changelogs/config.yaml new file mode 100644 index 000000000..c7efd0c64 --- /dev/null +++ b/ansible_collections/arista/eos/changelogs/config.yaml @@ -0,0 +1,30 @@ +changelog_filename_template: ../CHANGELOG.rst +changelog_filename_version_depth: 0 +changes_file: changelog.yaml +changes_format: combined +keep_fragments: false +mention_ancestor: true +new_plugins_after_name: removed_features +notesdir: fragments +prelude_section_name: release_summary +prelude_section_title: Release Summary +flatmap: true +sections: + - - major_changes + - Major Changes + - - minor_changes + - Minor Changes + - - breaking_changes + - Breaking Changes / Porting Guide + - - deprecated_features + - Deprecated Features + - - removed_features + - Removed Features (previously deprecated) + - - security_fixes + - Security Fixes + - - bugfixes + - Bugfixes + - - known_issues + - Known Issues +title: Arista Eos Collection +trivial_section_name: trivial diff --git a/ansible_collections/arista/eos/changelogs/fragments/.keep b/ansible_collections/arista/eos/changelogs/fragments/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_acl_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_acl_interfaces_module.rst new file mode 100644 index 000000000..bdc7d5234 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_acl_interfaces_module.rst @@ -0,0 +1,552 @@ +.. _arista.eos.eos_acl_interfaces_module: + + +***************************** +arista.eos.eos_acl_interfaces +***************************** + +**ACL interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages adding and removing Access Control Lists (ACLs) from interfaces on devices running EOS software. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of ACL options for interfaces.
+
+
+ access_groups + +
+ list + / elements=dictionary +
+
+ +
Specifies ACLs attached to the interfaces.
+
+
+ acls + +
+ list + / elements=dictionary +
+
+ +
Specifies the ACLs for the provided AFI.
+
+
+ direction + +
+ string + / required +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Specifies the direction of packets that the ACL will be applied on.
+
+
+ name + +
+ string + / required +
+
+ +
Specifies the name of the IPv4/IPv4 ACL for the interface.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Specifies the AFI for the ACL(s) to be configured on this interface.
+
+
+ name + +
+ string + / required +
+
+ +
Name/Identifier for the interface.
+
+
+ running_config + +
+ string +
+
+ +
The module, by default, will connect to the remote device and retrieve the current running-config to use as a base for comparing against the contents of source. There are times when it is not desirable to have the task get the current running-config for every task in a playbook. The running_config argument allows the implementer to pass in the configuration to use as the base config for comparison. This value of this option should be the output received from device by executing command
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • gathered
  • +
  • parsed
  • +
  • rendered
  • +
+
+
The state the configuration should be left in.
+
+
+ + + + +Examples +-------- + +.. code-block:: yaml + + # Using Merged + + # Before state: + # ------------- + # + # eos#sh running-config | include interface|access-group + # interface Ethernet1 + # interface Ethernet2 + # interface Ethernet3 + + - name: Merge module attributes of given access-groups + arista.eos.eos_acl_interfaces: + config: + - name: Ethernet2 + access_groups: + - afi: ipv4 + acls: + name: acl01 + direction: in + - afi: ipv6 + acls: + name: acl03 + direction: out + state: merged + + # Commands Fired: + # --------------- + # + # interface Ethernet2 + # ip access-group acl01 in + # ipv6 access-group acl03 out + + # After state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Loopback888 + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 in + # ipv6 access-group acl03 out + # interface Ethernet3 + + + # Using Replaced + + # Before state: + # ------------- + # + # eos#sh running-config | include interface|access-group + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 in + # ipv6 access-group acl03 out + # interface Ethernet3 + # ip access-group acl01 in + + - name: Replace module attributes of given access-groups + arista.eos.eos_acl_interfaces: + config: + - name: Ethernet2 + access_groups: + - afi: ipv4 + acls: + name: acl01 + direction: out + state: replaced + + # Commands Fired: + # --------------- + # + # interface Ethernet2 + # no ip access-group acl01 in + # no ipv6 access-group acl03 out + # ip access-group acl01 out + + # After state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Loopback888 + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 out + # interface Ethernet3 + # ip access-group acl01 in + + + # Using Overridden + + # Before state: + # ------------- + # + # eos#sh running-config | include interface|access-group + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 in + # ipv6 access-group acl03 out + # interface Ethernet3 + # ip access-group acl01 in + + - name: Override module attributes of given access-groups + arista.eos.eos_acl_interfaces: + config: + - name: Ethernet2 + access_groups: + - afi: ipv4 + acls: + name: acl01 + direction: out + state: overridden + + # Commands Fired: + # --------------- + # + # interface Ethernet2 + # no ip access-group acl01 in + # no ipv6 access-group acl03 out + # ip access-group acl01 out + # interface Ethernet3 + # no ip access-group acl01 in + + # After state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Loopback888 + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 out + # interface Ethernet3 + + + # Using Deleted + + # Before state: + # ------------- + # + # eos#sh running-config | include interface|access-group + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 in + # ipv6 access-group acl03 out + # interface Ethernet3 + # ip access-group acl01 out + + - name: Delete module attributes of given access-groups + arista.eos.eos_acl_interfaces: + config: + - name: Ethernet2 + access_groups: + - afi: ipv4 + acls: + name: acl01 + direction: in + - afi: ipv6 + acls: + name: acl03 + direction: out + state: deleted + + # Commands Fired: + # --------------- + # + # interface Ethernet2 + # no ip access-group acl01 in + # no ipv6 access-group acl03 out + + # After state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Loopback888 + # interface Ethernet1 + # interface Ethernet2 + # interface Ethernet3 + # ip access-group acl01 out + + + # Before state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 in + # ipv6 access-group acl03 out + # interface Ethernet3 + # ip access-group acl01 out + + - name: Delete module attributes of given access-groups from ALL Interfaces + arista.eos.eos_acl_interfaces: + config: + state: deleted + + # Commands Fired: + # --------------- + # + # interface Ethernet2 + # no ip access-group acl01 in + # no ipv6 access-group acl03 out + # interface Ethernet3 + # no ip access-group acl01 out + + # After state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Loopback888 + # interface Ethernet1 + # interface Ethernet2 + # interface Ethernet3 + + # Before state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 in + # ipv6 access-group acl03 out + # interface Ethernet3 + # ip access-group acl01 out + + - name: Delete acls under afi + arista.eos.eos_acl_interfaces: + config: + - name: Ethernet3 + access_groups: + - afi: ipv4 + - name: Ethernet2 + access_groups: + - afi: ipv6 + state: deleted + + # Commands Fired: + # --------------- + # + # interface Ethernet2 + # no ipv6 access-group acl03 out + # interface Ethernet3 + # no ip access-group acl01 out + + # After state: + # ------------- + # + # eos#sh running-config | include interface| access-group + # interface Loopback888 + # interface Ethernet1 + # interface Ethernet2 + # ip access-group acl01 in + # interface Ethernet3 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The resulting configuration model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration prior to the model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['interface Ethernet2', 'ip access-group acl01 in', 'ipv6 access-group acl03 out', 'interface Ethernet3', 'ip access-group acl01 out']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- GomathiSelvi S (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_acls_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_acls_module.rst new file mode 100644 index 000000000..5ca0e4a17 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_acls_module.rst @@ -0,0 +1,3285 @@ +.. _arista.eos.eos_acls_module: + + +******************* +arista.eos.eos_acls +******************* + +**ACLs resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages the IP access-list attributes of Arista EOS interfaces. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of IP access-list options
+
+
+ acls + +
+ list + / elements=dictionary +
+
+ +
A list of Access Control Lists (ACL).
+
+
+ aces + +
+ list + / elements=dictionary +
+
+ +
Filtering data
+
+
+ destination + +
+ dictionary +
+
+ +
The packet's destination address
+
+
+ address + +
+ string +
+
+ +
dotted decimal notation of IP address
+
+
+ any + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Rule matches all source addresses
+
+
+ host + +
+ string +
+
+ +
Host IP address
+
+
+ port_protocol + +
+ dictionary +
+
+ +
Specify dest port/protocol, along with operator . (comes with tcp/udp).
+
+
+ subnet_address + +
+ string +
+
+ +
A subnet address
+
+
+ wildcard_bits + +
+ string +
+
+ +
Source wildcard bits
+
+
+ fragment_rules + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Add fragment rules
+
+
+ fragments + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match non-head fragment packets
+
+
+ grant + +
+ string +
+
+
    Choices: +
  • permit
  • +
  • deny
  • +
+
+
Action to be applied on the rule
+
+
+ hop_limit + +
+ dictionary +
+
+ +
Hop limit value.
+
+
+ line + +
+ string +
+
+ +
For fact gathering, any ACE that is not fully parsed, while show up as a value of this attribute.
+

aliases: ace
+
+
+ log + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log matches against this rule
+
+
+ protocol + +
+ string +
+
+ +
Specify the protocol to match.
+
Refer to vendor documentation for valid values.
+
+
+ protocol_options + +
+ dictionary +
+
+ +
All the possible sub options for the protocol chosen.
+
+
+ icmp + +
+ dictionary +
+
+ +
Internet Control Message Protocol settings.
+
+
+ administratively_prohibited + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively prohibited
+
+
+ alternate_address + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Alternate address
+
+
+ conversion_error + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Datagram conversion
+
+
+ dod_host_prohibited + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host prohibited
+
+
+ dod_net_prohibited + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Net prohibited
+
+
+ echo + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Echo (ping)
+
+
+ echo_reply + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Echo reply
+
+
+ general_parameter_problem + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Parameter problem
+
+
+ host_isolated + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host isolated
+
+
+ host_precedence_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host unreachable for precedence
+
+
+ host_redirect + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host redirect
+
+
+ host_tos_redirect + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host redirect for TOS
+
+
+ host_tos_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host unreachable for TOS
+
+
+ host_unknown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host unknown
+
+
+ host_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Host unreachable
+
+
+ information_reply + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Information replies
+
+
+ information_request + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Information requests
+
+
+ mask_reply + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Mask replies
+
+
+ mask_request + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Mask requests
+
+
+ message_code + +
+ integer +
+
+ +
ICMP message code
+
+
+ message_num + +
+ integer +
+
+ +
icmp msg type number.
+
+
+ message_type + +
+ integer +
+
+ +
ICMP message type
+
+
+ mobile_redirect + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Mobile host redirect
+
+
+ net_redirect + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Network redirect
+
+
+ net_tos_redirect + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Net redirect for TOS
+
+
+ net_tos_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Network unreachable for TOS
+
+
+ net_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Net unreachable
+
+
+ network_unknown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Network unknown
+
+
+ no_room_for_option + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Parameter required but no room
+
+
+ option_missing + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Parameter required but not present
+
+
+ packet_too_big + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Fragmentation needed and DF set
+
+
+ parameter_problem + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All parameter problems
+
+
+ port_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Port unreachable
+
+
+ precedence_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Precedence cutoff
+
+
+ protocol_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Protocol unreachable
+
+
+ reassembly_timeout + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Reassembly timeout
+
+
+ redirect + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All redirects
+
+
+ router_advertisement + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Router discovery advertisements
+
+
+ router_solicitation + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Router discovery solicitations
+
+
+ source_quench + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Source quenches
+
+
+ source_route_failed + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Source route failed
+
+
+ time_exceeded + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All time exceededs
+
+
+ timestamp_reply + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Timestamp replies
+
+
+ timestamp_request + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Timestamp requests
+
+
+ traceroute + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Traceroute
+
+
+ ttl_exceeded + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
TTL exceeded
+
+
+ unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All unreachables
+
+
+ icmpv6 + +
+ dictionary +
+
+ +
Options for icmpv6.
+
+
+ address_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
address unreachable
+
+
+ beyond_scope + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
beyond_scope
+
+
+ echo_reply + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
echo_reply
+
+
+ echo_request + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
echo reques
+
+
+ erroneous_header + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
erroneous header
+
+
+ fragment_reassembly_exceeded + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
fragment_reassembly_exceeded
+
+
+ hop_limit_exceeded + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
hop limit exceeded
+
+
+ neighbor_advertisement + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
neighbor advertisement
+
+
+ neighbor_solicitation + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
neighbor_solicitation
+
+
+ no_admin + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
no admin
+
+
+ no_route + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
no route
+
+
+ packet_too_big + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
packet too big
+
+
+ parameter_problem + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
parameter problem
+
+
+ port_unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
port unreachable
+
+
+ redirect_message + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
redirect message
+
+
+ reject_route + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
reject route
+
+
+ router_advertisement + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
router_advertisement
+
+
+ router_solicitation + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
router_solicitation
+
+
+ source_address_failed + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
source_address_failed
+
+
+ source_routing_error + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
source_routing_error
+
+
+ time_exceeded + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
time_exceeded
+
+
+ unreachable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
unreachable
+
+
+ unrecognized_ipv6_option + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
unrecognized_ipv6_option
+
+
+ unrecognized_next_header + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
unrecognized_next_header
+
+
+ ip + +
+ dictionary +
+
+ +
Internet Protocol.
+
+
+ nexthop_group + +
+ string +
+
+ +
Nexthop-group name.
+
+
+ ipv6 + +
+ dictionary +
+
+ +
Internet V6 Protocol.
+
+
+ nexthop_group + +
+ string +
+
+ +
Nexthop-group name.
+
+
+ tcp + +
+ dictionary +
+
+ +
Options for tcp protocol.
+
+
+ flags + +
+ dictionary +
+
+ +
Match TCP packet flags
+
+
+ ack + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match on the ACK bit
+
+
+ established + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match established connections
+
+
+ fin + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match on the FIN bit
+
+
+ psh + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match on the PSH bit
+
+
+ rst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match on the RST bit
+
+
+ syn + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match on the SYN bit
+
+
+ urg + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match on the URG bit
+
+
+ remark + +
+ string +
+
+ +
Specify a comment
+
+
+ sequence + +
+ integer +
+
+ +
sequence number for the ordered list of rules
+
+
+ source + +
+ dictionary +
+
+ +
The packet's source address
+
+
+ address + +
+ string +
+
+ +
dotted decimal notation of IP address
+
+
+ any + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Rule matches all source addresses
+
+
+ host + +
+ string +
+
+ +
Host IP address
+
+
+ port_protocol + +
+ dictionary +
+
+ +
Specify source port/protocoli, along with operator. (comes with tcp/udp).
+
+
+ subnet_address + +
+ string +
+
+ +
A subnet address
+
+
+ wildcard_bits + +
+ string +
+
+ +
Source wildcard bits
+
+
+ tracked + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Match packets in existing ICMP/UDP/TCP connections
+
+
+ ttl + +
+ dictionary +
+
+ +
Compares the TTL (time-to-live) value in the packet to a specified value
+
+
+ eq + +
+ integer +
+
+ +
Match a single TTL value
+
+
+ gt + +
+ integer +
+
+ +
Match TTL greater than this number
+
+
+ lt + +
+ integer +
+
+ +
Match TTL lesser than this number
+
+
+ neq + +
+ integer +
+
+ +
Match TTL not equal to this value
+
+
+ vlan + +
+ string +
+
+ +
Vlan options
+
+
+ name + +
+ string + / required +
+
+ +
Name of the acl-list
+
+
+ standard + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
standard access-list or not
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
The Address Family Indicator (AFI) for the Access Control Lists (ACL).
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section access-list.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # show running-config | section access-list + # ip access-list test1 + # 10 permit ip 10.10.10.0/24 any ttl eq 200 + # 20 permit ip 10.30.10.0/24 host 10.20.10.1 + # 30 deny tcp host 10.10.20.1 eq finger www any syn log + # 40 permit ip any any + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + - name: Merge provided configuration with device configuration + arista.eos.eos_acls: + config: + - afi: ipv4 + acls: + - name: test1 + aces: + - sequence: 35 + grant: deny + protocol: ospf + source: + subnet_address: 20.0.0.0/8 + destination: + any: true + state: merged + + # After state: + # ------------ + # + # show running-config | section access-list + # ip access-list test1 + # 10 permit ip 10.10.10.0/24 any ttl eq 200 + # 20 permit ip 10.30.10.0/24 host 10.20.10.1 + # 30 deny tcp host 10.10.20.1 eq finger www any syn log + # 35 deny ospf 20.0.0.0/8 any + # 40 permit ip any any + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + # Using merged + + # Before state: + # ------------- + # show running-config | section access-list + # ip access-list test1 + # 10 permit ip 10.10.10.0/24 any ttl eq 200 + # 20 permit ip 10.30.10.0/24 host 10.20.10.1 + # 30 deny tcp host 10.10.20.1 eq finger www any syn log + # 40 permit ip any any + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + - name: Merge to update the given configuration with an existing ace + arista.eos.eos_acls: + config: + - afi: ipv4 + acls: + - name: test1 + aces: + - sequence: 35 + log: true + ttl: + eq: 33 + state: merged + + # After state: + # ------------ + # + # show running-config | section access-list + # ip access-list test1 + # 10 permit ip 10.10.10.0/24 any ttl eq 200 + # 20 permit ip 10.30.10.0/24 host 10.20.10.1 + # 30 deny tcp host 10.10.20.1 eq finger www any syn log + # 35 deny ospf 20.0.0.0/8 any ttl eq 33 log + # 40 permit ip any any + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + # Using replaced + + # Before state: + # ------------- + # show running-config | section access-list + # ip access-list test1 + # 10 permit ip 10.10.10.0/24 any ttl eq 200 + # 20 permit ip 10.30.10.0/24 host 10.20.10.1 + # 30 deny tcp host 10.10.20.1 eq finger www any syn log + # 40 permit ip any any + # ! + # ip access-list test3 + # 10 permit ip 35.33.0.0/16 any log + # ! + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + + + - name: Replace device configuration with provided configuration + arista.eos.eos_acls: + config: + - afi: ipv4 + acls: + - name: test1 + aces: + - sequence: 35 + grant: permit + protocol: ospf + source: + subnet_address: 20.0.0.0/8 + destination: + any: true + state: replaced + + # After state: + # ------------ + # + # show running-config | section access-list + # ip access-list test1 + # 35 permit ospf 20.0.0.0/8 any + # ! + # ip access-list test3 + # 10 permit ip 35.33.0.0/16 any log + # ! + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + + # Using overridden + + # Before state: + # ------------- + # show running-config | section access-list + # ip access-list test1 + # 10 permit ip 10.10.10.0/24 any ttl eq 200 + # 20 permit ip 10.30.10.0/24 host 10.20.10.1 + # 30 deny tcp host 10.10.20.1 eq finger www any syn log + # 40 permit ip any any + # ! + # ip access-list test3 + # 10 permit ip 35.33.0.0/16 any log + # ! + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + + + - name: override device configuration with provided configuration + arista.eos.eos_acls: + config: + - afi: ipv4 + acls: + - name: test1 + aces: + - sequence: 35 + grant: permit + protocol: ospf + source: + subnet_address: 20.0.0.0/8 + destination: + any: true + state: overridden + + # After state: + # ------------ + # + # show running-config | section access-list + # ip access-list test1 + # 35 permit ospf 20.0.0.0/8 any + # ! + + # Using deleted: + + # Before state: + # ------------- + # show running-config | section access-list + # ip access-list test1 + # 10 permit ip 10.10.10.0/24 any ttl eq 200 + # 20 permit ip 10.30.10.0/24 host 10.20.10.1 + # 30 deny tcp host 10.10.20.1 eq finger www any syn log + # 40 permit ip any any + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + # ! + + - name: Delete provided configuration + arista.eos.eos_acls: + config: + - afi: ipv4 + acls: + - name: test1 + state: deleted + + # After state: + # ------------ + # + # show running-config | section access-list + + # ipv6 access-list test2 + # 10 deny icmpv6 any any reject-route hop-limit eq 20 + + + # using gathered + + # ip access-list test1 + # 35 deny ospf 20.0.0.0/8 any + # ip access-list test2 + # 40 permit vlan 55 0xE2 icmpv6 any any log + + - name: Gather the existing configuration + arista.eos.eos_acls: + state: gathered + + # returns: + + + # arista.eos.eos_acls: + # config: + # - afi: "ipv4" + # acls: + # - name: test1 + # aces: + # - sequence: 35 + # grant: "deny" + # protocol: "ospf" + # source: + # subnet_address: 20.0.0.0/8 + # destination: + # any: true + # - afi: "ipv6" + # acls: + # - name: test2 + # aces: + # - sequence: 40 + # grant: "permit" + # vlan: "55 0xE2" + # protocol: "icmpv6" + # log: true + # source: + # any: true + # destination: + # any: true + + + # using rendered + + - name: Delete provided configuration + arista.eos.eos_acls: + config: + - afi: ipv4 + acls: + - name: test1 + aces: + - sequence: 35 + grant: deny + protocol: ospf + source: + subnet_address: 20.0.0.0/8 + destination: + any: true + - afi: ipv6 + acls: + - name: test2 + aces: + - sequence: 40 + grant: permit + vlan: 55 0xE2 + protocol: icmpv6 + log: true + source: + any: true + destination: + any: true + state: rendered + + # returns: + + # ip access-list test1 + # 35 deny ospf 20.0.0.0/8 any + # ip access-list test2 + # 40 permit vlan 55 0xE2 icmpv6 any any log + + + # Using Parsed + + # parsed_acls.cfg + + # ipv6 access-list standard test2 + # 10 permit any log + # ! + # ip access-list test1 + # 35 deny ospf 20.0.0.0/8 any + # 45 remark Run by ansible + # 55 permit tcp any any + # ! + + - name: parse configs + arista.eos.eos_acls: + running_config: "{{ lookup('file', './parsed_acls.cfg') }}" + state: parsed + + # returns + # "parsed": [ + # { + # "acls": [ + # { + # "aces": [ + # { + # "destination": { + # "any": true + # }, + # "grant": "deny", + # "protocol": "ospf", + # "sequence": 35, + # "source": { + # "subnet_address": "20.0.0.0/8" + # } + # }, + # { + # "remark": "Run by ansible", + # "sequence": 45 + # }, + # { + # "destination": { + # "any": true + # }, + # "grant": "permit", + # "protocol": "tcp", + # "sequence": 55, + # "source": { + # "any": true + # } + # } + # ], + # "name": "test1" + # } + # ], + # "afi": "ipv4" + # }, + # { + # "acls": [ + # { + # "aces": [ + # { + # "grant": "permit", + # "log": true, + # "sequence": 10, + # "source": { + # "any": true + # } + # } + # ], + # "name": "test2", + # "standard": true + # } + # ], + # "afi": "ipv6" + # } + # ] + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The resulting configuration model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration prior to the model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['ipv6 access-list standard test2', '10 permit any log', 'ip access-list test1', '35 deny ospf 20.0.0.0/8 any', '45 remark Run by ansible', '55 permit tcp any any']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gomathiselvi S (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_banner_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_banner_module.rst new file mode 100644 index 000000000..80f7ef3b7 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_banner_module.rst @@ -0,0 +1,180 @@ +.. _arista.eos.eos_banner_module: + + +********************* +arista.eos.eos_banner +********************* + +**Manage multiline banners on Arista EOS devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This will configure both login and motd banners on remote devices running Arista EOS. It allows playbooks to add or remote banner text from the active running configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ banner + +
+ string + / required +
+
+
    Choices: +
  • login
  • +
  • motd
  • +
+
+
Specifies which banner that should be configured on the remote device.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Specifies whether or not the configuration is present in the current devices active running configuration.
+
+
+ text + +
+ string +
+
+ +
The banner text that should be present in the remote device running configuration. This argument accepts a multiline string. Requires state=present.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure the login banner + arista.eos.eos_banner: + banner: login + text: | + this is my login banner + that contains a multiline + string + state: present + + - name: remove the motd banner + arista.eos.eos_banner: + banner: motd + state: absent + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['banner login', 'this is my login banner', 'that contains a multiline', 'string', 'EOF']
+
+
+ session_name + +
+ string +
+
if changes +
The EOS config session name used to load the configuration
+
+
Sample:
+
ansible_1479315771
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_address_family_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_address_family_module.rst new file mode 100644 index 000000000..08ef1f037 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_address_family_module.rst @@ -0,0 +1,2130 @@ +.. _arista.eos.eos_bgp_address_family_module: + + +********************************* +arista.eos.eos_bgp_address_family +********************************* + +**Manages BGP address family resource module** + + +Version added: 1.4.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of BGP AF on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
Configurations for BGP address family.
+
+
+ address_family + +
+ list + / elements=dictionary +
+
+ +
Enable address family and enter its config mode
+
+
+ afi + +
+ string +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
  • evpn
  • +
+
+
address family.
+
+
+ bgp_params + +
+ dictionary +
+
+ +
BGP parameters.
+
+
+ additional_paths + +
+ string +
+
+
    Choices: +
  • install
  • +
  • send
  • +
  • receive
  • +
+
+
BGP additional-paths commands
+
+
+ next_hop_address_family + +
+ string +
+
+
    Choices: +
  • ipv6
  • +
+
+
Next-hop address-family configuration
+
+
+ next_hop_unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Preserve original nexthop while advertising routes to eBGP peers.
+
+
+ redistribute_internal + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Redistribute internal BGP routes.
+
+
+ route + +
+ string +
+
+ +
Configure route-map for route installation.
+
+
+ graceful_restart + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart mode.
+
+
+ neighbor + +
+ list + / elements=dictionary +
+
+ +
Configure routing for a network.
+
+
+ activate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Activate neighbor in the address family.
+
+
+ additional_paths + +
+ string +
+
+
    Choices: +
  • send
  • +
  • receive
  • +
+
+
BGP additional-paths commands.
+
+
+ default_originate + +
+ dictionary +
+
+ +
Originate default route to this neighbor.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always originate default route to this neighbor.
+
+
+ route_map + +
+ string +
+
+ +
Route map reference.
+
+
+ encapsulation + +
+ dictionary +
+
+ +
Default transport encapsulation for neighbor. Applicable for evpn address-family.
+
+
+ source_interface + +
+ string +
+
+ +
Source interface to update BGP next hop address. Applicable for mpls transport.
+
+
+ transport + +
+ string +
+
+
    Choices: +
  • mpls
  • +
  • vxlan
  • +
+
+
MPLS/VXLAN transport.
+
+
+ graceful_restart + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart mode.
+
+
+ next_hop_address_family + +
+ string +
+
+
    Choices: +
  • ipv6
  • +
+
+
Next-hop address-family configuration
+
+
+ next_hop_unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Preserve original nexthop while advertising routes to eBGP peers.
+
+
+ peer + +
+ string +
+
+ +
Neighbor address/ peer group name.
+
+
+ prefix_list + +
+ dictionary +
+
+ +
Prefix list reference.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Configure an inbound/outbound prefix-list.
+
+
+ name + +
+ string +
+
+ +
prefix list name.
+
+
+ route_map + +
+ dictionary +
+
+ +
Route map reference.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Configure an inbound/outbound route-map.
+
+
+ name + +
+ string +
+
+ +
Route map name.
+
+
+ weight + +
+ integer +
+
+ +
Weight to assign.
+
+
+ network + +
+ list + / elements=dictionary +
+
+ +
configure routing for network.
+
+
+ address + +
+ string +
+
+ +
network address.
+
+
+ route_map + +
+ string +
+
+ +
Route map reference.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Redistribute routes in to BGP.
+
+
+ isis_level + +
+ string +
+
+
    Choices: +
  • level-1
  • +
  • level-2
  • +
  • level-1-2
  • +
+
+
Applicable for isis routes. Specify isis route level.
+
+
+ ospf_route + +
+ string +
+
+
    Choices: +
  • internal
  • +
  • external
  • +
  • nssa_external_1
  • +
  • nssa_external_2
  • +
+
+
ospf route options.
+
+
+ protocol + +
+ string +
+
+
    Choices: +
  • isis
  • +
  • ospfv3
  • +
  • dhcp
  • +
+
+
Routes to be redistributed.
+
+
+ route_map + +
+ string +
+
+ +
Route map reference.
+
+
+ route_target + +
+ dictionary +
+
+ +
Route target.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • both
  • +
  • import
  • +
  • export
  • +
+
+
Route action.
+
+
+ imported_route + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Export routes imported from the same Afi/Safi
+
+
+ route_map + +
+ string +
+
+ +
Name of a route map.
+
+
+ target + +
+ string +
+
+ +
Route Target.
+
+
+ type + +
+ string +
+
+
    Choices: +
  • evpn
  • +
  • vpn-ipv4
  • +
  • vpn-ipv6
  • +
+
+
Type of address fmaily
+

aliases: mode
+
+
+ safi + +
+ string +
+
+
    Choices: +
  • labeled-unicast
  • +
  • multicast
  • +
+
+
Address family type for ipv4.
+
+
+ vrf + +
+ string +
+
+ +
name of the VRF in which BGP will be configured.
+
+
+ as_number + +
+ string +
+
+ +
Autonomous system number.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section bgp.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state + + # veos(config)#show running-config | section bgp + # veos(config)# + + - name: Merge provided configuration with device configuration + arista.eos.eos_bgp_address_family: + config: + as_number: "10" + address_family: + - afi: "ipv4" + redistribute: + - protocol: "ospfv3" + ospf_route: "external" + network: + - address: "1.1.1.0/24" + - address: "1.5.1.0/24" + route_map: "MAP01" + - afi: "ipv6" + bgp_params: + additional_paths: "receive" + neighbor: + - peer: "peer2" + default_originate: + always: True + - afi: "ipv6" + redistribute: + - protocol: "isis" + isis_level: "level-2" + route_target: + mode: "export" + target: "33:11" + vrf: "vrft" + state: merged + + # After state: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # bgp additional-paths receive + # neighbor peer2 activate + # neighbor peer2 default-originate always + # ! + # vrf vrft + # address-family ipv6 + # route-target export 33:11 + # redistribute isis level-2 + # veos(config-router-bgp)# + + # Module Execution: + + # "after": { + # "address_family": [ + # { + # "afi": "ipv4", + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "redistribute": [ + # { + # "isis_level": "level-2", + # "protocol": "isis" + # } + # ], + # "route_target": { + # "mode": "export", + # "target": "33:11" + # }, + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "before": {}, + # "changed": true, + # "commands": [ + # "router bgp 10", + # "address-family ipv4", + # "redistribute ospfv3 match external", + # "network 1.1.1.0/24", + # "network 1.5.1.0/24 route-map MAP01", + # "exit", + # "address-family ipv6", + # "neighbor peer2 default-originate always", + # "bgp additional-paths receive", + # "exit", + # "vrf vrft", + # "address-family ipv6", + # "redistribute isis level-2", + # "route-target export 33:11", + # "exit", + # "exit" + # ], + + # Using replaced: + + # Before State: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # bgp additional-paths receive + # neighbor peer2 activate + # neighbor peer2 default-originate always + # ! + # vrf vrft + # address-family ipv6 + # route-target export 33:11 + # redistribute isis level-2 + # veos(config-router-bgp)# + # + + - name: Replace + arista.eos.eos_bgp_address_family: + config: + as_number: "10" + address_family: + - afi: "ipv6" + vrf: "vrft" + redistribute: + - protocol: "ospfv3" + ospf_route: "external" + - afi: "ipv6" + redistribute: + - protocol: "isis" + isis_level: "level-2" + state: replaced + + # After State: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # neighbor peer2 default-originate always + # redistribute isis level-2 + # ! + # vrf vrft + # address-family ipv6 + # redistribute ospfv3 match external + # veos(config-router-bgp)# + # + # + # # Module Execution: + # + # "after": { + # "address_family": [ + # { + # "afi": "ipv4", + # "neighbor": [ + # { + # "activate": true, + # "peer": "1.1.1.1" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "redistribute": [ + # { + # "isis_level": "level-2", + # "protocol": "isis" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ], + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "before": { + # "address_family": [ + # { + # "afi": "ipv4", + # "neighbor": [ + # { + # "activate": true, + # "peer": "1.1.1.1" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "activate": true, + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "redistribute": [ + # { + # "isis_level": "level-2", + # "protocol": "isis" + # } + # ], + # "route_target": { + # "mode": "export", + # "target": "33:11" + # }, + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "changed": true, + # "commands": [ + # "router bgp 10", + # "vrf vrft", + # "address-family ipv6", + # "redistribute ospfv3 match external", + # "no redistribute isis level-2", + # "no route-target export 33:11", + # "exit", + # "exit", + # "address-family ipv6", + # "redistribute isis level-2", + # "no neighbor peer2 activate", + # "no bgp additional-paths receive", + # "exit" + # ], + + # Using overridden (overriding af at global context): + # Before state: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # neighbor peer2 default-originate always + # redistribute isis level-2 + # ! + # vrf vrft + # address-family ipv6 + # redistribute ospfv3 match external + # veos(config-router-bgp)# + + - name: Overridden + arista.eos.eos_bgp_address_family: + config: + as_number: "10" + address_family: + - afi: "ipv4" + bgp_params: + additional_paths: "receive" + neighbor: + - peer: "peer2" + default_originate: + always: True + state: overridden + + # After State: + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # ! + # vrf vrft + # address-family ipv6 + # redistribute ospfv3 match external + # veos(config-router-bgp)# + # + # Module Execution: + # + # "after": { + # "address_family": [ + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ], + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "before": { + # "address_family": [ + # { + # "afi": "ipv4", + # "neighbor": [ + # { + # "activate": true, + # "peer": "1.1.1.1" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "redistribute": [ + # { + # "isis_level": "level-2", + # "protocol": "isis" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ], + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "changed": true, + # "commands": [ + # "router bgp 10", + # "address-family ipv4", + # "no redistribute ospfv3 match external", + # "no network 1.1.1.0/24", + # "no network 1.5.1.0/24 route-map MAP01", + # "neighbor peer2 default-originate always", + # "no neighbor 1.1.1.1 activate", + # "bgp additional-paths receive", + # "exit", + # "no address-family ipv6" + # ], + + # using Overridden (overridding af in vrf context): + + # Before State: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # no neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # ! + # vrf vrft + # address-family ipv6 + # route-target export 33:11 + # redistribute isis level-2 + # redistribute ospfv3 match external + # veos(config-router-bgp)# + + + - name: Overridden + arista.eos.eos_bgp_address_family: + config: + as_number: "10" + address_family: + - afi: "ipv4" + bgp_params: + additional_paths: "receive" + neighbor: + - peer: "peer2" + default_originate: + always: True + vrf: vrft + state: overridden + + # After State: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # ! + # vrf vrft + # address-family ipv4 + # bgp additional-paths receive + # veos(config-router-bgp)# + # + # Module Execution: + # + # "after": { + # "address_family": [ + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ] + # }, + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "before": { + # "address_family": [ + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "redistribute": [ + # { + # "isis_level": "level-2", + # "protocol": "isis" + # }, + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ], + # "route_target": { + # "mode": "export", + # "target": "33:11" + # }, + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "changed": true, + # "commands": [ + # "router bgp 10", + # "vrf vrft", + # "address-family ipv4", + # "neighbor peer2 default-originate always", + # "bgp additional-paths receive", + # "exit", + # "exit", + # " vrf vrft", + # "no address-family ipv6" + # ], + + # Using Deleted: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # no neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # ! + # vrf vrft + # address-family ipv4 + # bgp additional-paths receive + # veos(config-router-bgp)# + + - name: Delete + arista.eos.eos_bgp_address_family: + config: + as_number: "10" + address_family: + - afi: "ipv6" + vrf: "vrft" + - afi: "ipv6" + state: deleted + + # After State: + + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # no neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # vrf vrft + # address-family ipv4 + # bgp additional-paths receive + # veos(config-router-bgp)# + # + # Module Execution: + # + # "after": { + # "address_family": [ + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + # "before": { + # "address_family": [ + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ] + # }, + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + + # Using parsed: + + # parsed_bgp_address_family.cfg : + + # router bgp 10 + # neighbor n2 peer group + # neighbor n2 next-hop-unchanged + # neighbor n2 maximum-routes 12000 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # ! + # address-family ipv4 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # redistribute ospfv3 match external + # ! + # address-family ipv6 + # no bgp additional-paths receive + # neighbor n2 next-hop-unchanged + # redistribute isis level-2 + # ! + # vrf bgp_10 + # ip access-group acl01 + # ucmp fec threshold trigger 33 clear 22 warning-only + # ! + # address-family ipv4 + # route-target import 20:11 + # ! + # vrf vrft + # address-family ipv4 + # bgp additional-paths receive + # ! + # address-family ipv6 + # redistribute ospfv3 match external + + - name: parse configs + arista.eos.eos_bgp_address_family: + running_config: "{{ lookup('file', './parsed_bgp_address_family.cfg') }}" + state: parsed + + # Module Execution: + # "parsed": { + # "address_family": [ + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "neighbor": [ + # { + # "next_hop_unchanged": true, + # "peer": "n2" + # } + # ], + # "redistribute": [ + # { + # "isis_level": "level-2", + # "protocol": "isis" + # } + # ] + # }, + # { + # "afi": "ipv4", + # "route_target": { + # "mode": "import", + # "target": "20:11" + # }, + # "vrf": "bgp_10" + # }, + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "vrf": "vrft" + # }, + # { + # "afi": "ipv6", + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ], + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # } + # } + + # Using gathered: + + # Device config: + # veos(config-router-bgp)#show running-config | section bgp + # router bgp 10 + # neighbor peer2 peer group + # neighbor peer2 maximum-routes 12000 + # neighbor 1.1.1.1 maximum-routes 12000 + # ! + # address-family ipv4 + # bgp additional-paths receive + # neighbor peer2 default-originate always + # no neighbor 1.1.1.1 activate + # network 1.1.1.0/24 + # network 1.5.1.0/24 route-map MAP01 + # redistribute ospfv3 match external + # ! + # vrf vrft + # address-family ipv4 + # bgp additional-paths receive + # veos(config-router-bgp)# + + - name: gather configs + arista.eos.eos_bgp_address_family: + state: gathered + + # Module Execution: + # "gathered": { + # "address_family": [ + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "neighbor": [ + # { + # "default_originate": { + # "always": true + # }, + # "peer": "peer2" + # } + # ], + # "network": [ + # { + # "address": "1.1.1.0/24" + # }, + # { + # "address": "1.5.1.0/24", + # "route_map": "MAP01" + # } + # ], + # "redistribute": [ + # { + # "ospf_route": "external", + # "protocol": "ospfv3" + # } + # ] + # }, + # { + # "afi": "ipv4", + # "bgp_params": { + # "additional_paths": "receive" + # }, + # "vrf": "vrft" + # } + # ], + # "as_number": "10" + # }, + + # using rendered: + + - name: Render + arista.eos.eos_bgp_address_family: + config: + as_number: "10" + address_family: + - afi: "ipv4" + redistribute: + - protocol: "ospfv3" + ospf_route: "external" + network: + - address: "1.1.1.0/24" + - address: "1.5.1.0/24" + route_map: "MAP01" + - afi: "ipv6" + bgp_params: + additional_paths: "receive" + neighbor: + - peer: "peer2" + default_originate: + always: True + - afi: "ipv6" + redistribute: + - protocol: "isis" + isis_level: "level-2" + route_target: + mode: "export" + target: "33:11" + vrf: "vrft" + + state: rendered + + # Module Execution: + + # "rendered": [ + # "router bgp 10", + # "address-family ipv4", + # "redistribute ospfv3 match external", + # "network 1.1.1.0/24", + # "network 1.5.1.0/24 route-map MAP01", + # "exit", + # "address-family ipv6", + # "neighbor peer2 default-originate always", + # "bgp additional-paths receive", + # "exit", + # "vrf vrft", + # "address-family ipv6", + # "redistribute isis level-2", + # "route-target export 33:11", + # "exit", + # "exit" + # ] + # + + + + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_global_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_global_module.rst new file mode 100644 index 000000000..e04df2071 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_global_module.rst @@ -0,0 +1,8554 @@ +.. _arista.eos.eos_bgp_global_module: + + +************************* +arista.eos.eos_bgp_global +************************* + +**Manages BGP global resource module** + + +Version added: 1.4.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of BGP global on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A list of configurations for BGP global.
+
+
+ access_group + +
+ list + / elements=dictionary +
+
+ +
ip/ipv6 access list configuration.
+
+
+ acl_name + +
+ string +
+
+ +
access list name.
+
+
+ afi + +
+ string +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Specify ip/ipv6.
+
+
+ direction + +
+ string +
+
+ +
direction of packets.
+
+
+ aggregate_address + +
+ list + / elements=dictionary +
+
+ +
Configure aggregate address.
+
+
+ address + +
+ string +
+
+ +
ipv4/ipv6 address prefix.
+
+
+ advertise_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise without installing the generated blackhole route in FIB.
+
+
+ as_set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Generate autonomous system set path information.
+
+
+ attribute_map + +
+ string +
+
+ +
Name of the route map used to set the attribute of the aggregate route.
+
+
+ match_map + +
+ string +
+
+ +
Name of the route map used to filter the contributors of the aggregate route.
+
+
+ summary_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Filters all more-specific routes from updates.
+
+
+ as_number + +
+ string +
+
+ +
Autonomous system number.
+
+
+ bgp_params + +
+ dictionary +
+
+ +
BGP parameters.
+
+
+ additional_paths + +
+ string +
+
+
    Choices: +
  • install
  • +
  • send
  • +
  • receive
  • +
+
+
BGP additional-paths commands
+
+
+ advertise_inactive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise BGP routes even if they are inactive in RIB.
+
+
+ allowas_in + +
+ dictionary +
+
+ +
Allow local-as in updates.
+
+
+ count + +
+ integer +
+
+ +
Number of local ASNs allowed in a BGP update.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, it is set.
+
+
+ always_compare_med + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
BGP Always Compare MED
+
+
+ asn + +
+ string +
+
+
    Choices: +
  • asdot
  • +
  • asplain
  • +
+
+
AS Number notation.
+
+
+ auto_local_addr + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Automatically determine the local address to be used for the non-transport AF.
+
+
+ bestpath + +
+ dictionary +
+
+ +
Select the bestpath selection algorithim for BGP routes.
+
+
+ as_path + +
+ string +
+
+
    Choices: +
  • ignore
  • +
  • multipath_relax
  • +
+
+
Select the bestpath selection based on as-path.
+
+
+ ecmp_fast + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Tie-break BGP paths in a ECMP group based on the order of arrival.
+
+
+ med + +
+ dictionary +
+
+ +
MED attribute
+
+
+ confed + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
MED Confed.
+
+
+ missing_as_worst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
MED missing-as-worst.
+
+
+ skip + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
skip one of the tie breaking rules in the bestpath selection.
+
+
+ tie_break + +
+ string +
+
+
    Choices: +
  • cluster_list_length
  • +
  • router_id
  • +
+
+
Configure the tie-break option for BGP bestpath selection.
+
+
+ client_to_client + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
client to client configuration.
+
+
+ cluster_id + +
+ string +
+
+ +
Cluster ID of this router acting as a route reflector.
+
+
+ confederation + +
+ dictionary +
+
+ +
confederation.
+
+
+ identifier + +
+ string +
+
+ +
Confederation identifier.
+
+
+ peers + +
+ string +
+
+ +
Confederation peers.
+
+
+ control_plane_filter + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Control plane filter for BGP.
+
+
+ convergence + +
+ dictionary +
+
+ +
Bgp convergence parameters.
+
+
+ slow_peer + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Maximum amount of time to wait for slow peers to estabilsh session.
+
+
+ time + +
+ integer +
+
+ +
time in secs
+
+
+ default + +
+ string +
+
+
    Choices: +
  • ipv4_unicast
  • +
  • ipv6_unicast
  • +
+
+
Default neighbor configuration commands.
+
+
+ enforce_first_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enforce the First AS for EBGP routes(default).
+
+
+ host_routes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
BGP host routes configuration.
+
+
+ labeled_unicast + +
+ string +
+
+
    Choices: +
  • ip
  • +
  • tunnel
  • +
+
+
Labeled Unicast.
+
+
+ listen + +
+ dictionary +
+
+ +
BGP listen.
+
+
+ limit + +
+ integer +
+
+ +
Set limit on the number of dynamic BGP peers allowed.
+
+
+ range + +
+ dictionary +
+
+ +
Subnet Range to be associated with the peer group.
+
+
+ address + +
+ string +
+
+ +
Address prefix
+
+
+ peer_group + +
+ dictionary +
+
+ +
Name of peer group.
+
+
+ name + +
+ string +
+
+ +
name.
+
+
+ peer_filter + +
+ string +
+
+ +
Name of peer filter.
+
+
+ remote_as + +
+ string +
+
+ +
Neighbor AS number
+
+
+ log_neighbor_changes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log neighbor up/down events.
+
+
+ missing_policy + +
+ dictionary +
+
+ +
Missing policy override configuration commands.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • deny
  • +
  • permit
  • +
  • deny-in-out
  • +
+
+
Missing policy action options.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Missing policy direction options.
+
+
+ monitoring + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable Bgp monitoring for all/specified stations.
+
+
+ next_hop_unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Preserve original nexthop while advertising routes to eBGP peers.
+
+
+ redistribute_internal + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Redistribute internal BGP routes.
+
+
+ route + +
+ string +
+
+ +
Configure route-map for route installation.
+
+
+ route_reflector + +
+ dictionary +
+
+ +
Configure route reflector options
+
+
+ preserve + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
preserve route attributes, overwriting route-map changes
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True route_reflector is set.
+
+
+ transport + +
+ integer +
+
+ +
Configure transport port for TCP session
+
+
+ default_metric + +
+ integer +
+
+ +
Default metric.
+
+
+ distance + +
+ dictionary +
+
+ +
Define an administrative distance.
+
+
+ external + +
+ integer +
+
+ +
distance for external routes.
+
+
+ internal + +
+ integer +
+
+ +
distance for internal routes.
+
+
+ local + +
+ integer +
+
+ +
distance for local routes.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Enable graceful restart mode.
+
+
+ restart_time + +
+ integer +
+
+ +
Set the max time needed to restart and come back up.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, graceful restart is set.
+
+
+ stalepath_time + +
+ integer +
+
+ +
Set the max time to hold onto restarting peer stale paths.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart helper mode.
+
+
+ maximum_paths + +
+ dictionary +
+
+ +
Maximum number of equal cost paths.
+
+
+ max_equal_cost_paths + +
+ integer +
+
+ +
Value for maximum number of equal cost paths.
+
+
+ max_installed_ecmp_paths + +
+ integer +
+
+ +
Value for maximum number of installed ECMP routes.
+
+
+ monitoring + +
+ dictionary +
+
+ +
BGP monitoring protocol configuration.
+
+
+ port + +
+ integer +
+
+ +
Configure the BGP monitoring protocol port number <1024-65535>.
+
+
+ received + +
+ string +
+
+
    Choices: +
  • post_policy
  • +
  • pre_policy
  • +
+
+
BGP monitoring protocol received route selection.
+
+
+ station + +
+ string +
+
+ +
BGP monitoring station configuration.
+
+
+ timestamp + +
+ string +
+
+
    Choices: +
  • none
  • +
  • send_time
  • +
+
+
BGP monitoring protocol Per-Peer Header timestamp behavior.
+
+
+ neighbor + +
+ list + / elements=dictionary +
+
+ +
Configure routing for a network.
+

aliases: neighbors
+
+
+ additional_paths + +
+ string +
+
+
    Choices: +
  • send
  • +
  • receive
  • +
+
+
BGP additional-paths commands.
+
+
+ allowas_in + +
+ dictionary +
+
+ +
Allow local-as in updates.
+
+
+ count + +
+ integer +
+
+ +
Number of local ASNs allowed in a BGP update.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, it is set.
+
+
+ auto_local_addr + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Automatically determine the local address to be used for the non-transport AF.
+
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • c_bit
  • +
+
+
Configure BFD fallover for this peer
+
+
+ default_originate + +
+ dictionary +
+
+ +
Originate default route to this neighbor.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always originate default route to this neighbor.
+
+
+ route_map + +
+ string +
+
+ +
Route map reference.
+
+
+ description + +
+ string +
+
+ +
Text describing the neighbor.
+
+
+ dont_capability_negotiate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Donot perform Capability Negotiation with this neighbor.
+
+
+ ebgp_multihop + +
+ dictionary +
+
+ +
Allow BGP connections to indirectly connected external peers.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, ttl is not set.
+
+
+ ttl + +
+ integer +
+
+ +
Time-to-live in the range 1-255 hops.
+
+
+ encryption_password + +
+ dictionary +
+
+ +
Password to use in computation of MD5 hash.
+
+
+ password + +
+ string +
+
+ +
password (up to 80 chars).
+
+
+ type + +
+ integer +
+
+
    Choices: +
  • 0
  • +
  • 7
  • +
+
+
Encryption type.
+
+
+ enforce_first_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enforce the First AS for EBGP routes(default).
+
+
+ export_localpref + +
+ integer +
+
+ +
Override localpref when exporting to an internal peer.
+
+
+ fall_over + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure BFD protocol options for this peer.
+
+
+ graceful_restart + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart mode.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart helper mode.
+
+
+ idle_restart_timer + +
+ integer +
+
+ +
Neighbor idle restart timer.
+
+
+ import_localpref + +
+ integer +
+
+ +
Override localpref when importing from an external peer.
+
+
+ link_bandwidth + +
+ dictionary +
+
+ +
Enable link bandwidth community for routes to this peer.
+
+
+ auto + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable link bandwidth auto generation for routes from this peer.
+
+
+ default + +
+ string +
+
+ +
Enable link bandwidth default generation for routes from this peer.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, set link bandwidth
+
+
+ update_delay + +
+ integer +
+
+ +
Delay outbound route updates.
+
+
+ local_as + +
+ dictionary +
+
+ +
Configure local AS number advertised to peer.
+
+
+ as_number + +
+ string +
+
+ +
AS number.
+
+
+ fallback + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Prefer router AS Number over local AS Number.
+
+
+ local_v6_addr + +
+ string +
+
+ +
The local IPv6 address of the neighbor in A:B:C:D:E:F:G:H format.
+
+
+ maximum_accepted_routes + +
+ dictionary +
+
+ +
Maximum number of routes accepted from this peer.
+
+
+ count + +
+ integer +
+
+ +
Maximum number of accepted routes (0 means unlimited).
+
+
+ warning_limit + +
+ integer +
+
+ +
Maximum number of accepted routes after which a warning is issued. (0 means never warn)
+
+
+ maximum_received_routes + +
+ dictionary +
+
+ +
Maximum number of routes received from this peer.
+
+
+ count + +
+ integer +
+
+ +
Maximum number of routes (0 means unlimited).
+
+
+ warning_limit + +
+ dictionary +
+
+ +
Percentage of maximum-routes at which warning is to be issued.
+
+
+ limit_count + +
+ integer +
+
+ +
Number of routes at which to warn.
+
+
+ limit_percent + +
+ integer +
+
+ +
Percentage of maximum number of routes at which to warn( 1-100).
+
+
+ warning_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Only warn, no restart, if max route limit exceeded.
+
+
+ metric_out + +
+ integer +
+
+ +
MED value to advertise to peer.
+
+
+ monitoring + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BGP Monitoring Protocol for this peer.
+
+
+ neighbor_address + +
+ string +
+
+ +
Neighbor address or peer group.
+

aliases: peer
+
+
+ next_hop_self + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always advertise this router address as the BGP next hop
+
+
+ next_hop_unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Preserve original nexthop while advertising routes to eBGP peers.
+
+
+ next_hop_v6_address + +
+ string +
+
+ +
IPv6 next-hop address for the neighbor
+
+
+ out_delay + +
+ integer +
+
+ +
Delay outbound route updates.
+
+
+ peer_group + +
+ string +
+
+ +
Name of the peer group.
+
+
+ prefix_list + +
+ dictionary +
+
+ +
Prefix list reference.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Configure an inbound/outbound prefix-list.
+
+
+ name + +
+ string +
+
+ +
prefix list name.
+
+
+ remote_as + +
+ string +
+
+ +
Neighbor Autonomous System.
+
+
+ remove_private_as + +
+ dictionary +
+
+ +
Remove private AS number from updates to this peer.
+
+
+ all + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove private AS number.
+
+
+ replace_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Replace private AS number with local AS number.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, set remove_private_as.
+
+
+ route_map + +
+ dictionary +
+
+ +
Route map reference.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Configure an inbound/outbound route-map.
+
+
+ name + +
+ string +
+
+ +
Route map name.
+
+
+ route_reflector_client + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure peer as a route reflector client.
+
+
+ route_to_peer + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use routing table information to reach the peer.
+
+
+ send_community + +
+ dictionary +
+
+ +
Send community attribute to this neighbor.
+
+
+ community_attribute + +
+ string +
+
+ +
Type of community attributes to send to this neighbor.
+
+
+ divide + +
+ string +
+
+
    Choices: +
  • equal
  • +
  • ratio
  • +
+
+
link-bandwidth divide attribute.
+
+
+ link_bandwidth_attribute + +
+ string +
+
+
    Choices: +
  • aggregate
  • +
  • divide
  • +
+
+
cumulative/aggregate attribute to be sent.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable send-community
+
+
+ speed + +
+ string +
+
+ +
Reference link speed in bits/second
+
+
+ sub_attribute + +
+ string +
+
+
    Choices: +
  • extended
  • +
  • link-bandwidth
  • +
  • standard
  • +
+
+
Attribute to be sent to the neighbor.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shut down this neighbor.
+
+
+ soft_recognition + +
+ string +
+
+
    Choices: +
  • all
  • +
  • None
  • +
+
+
Configure how to handle routes that fail import.
+
+
+ timers + +
+ dictionary +
+
+ +
Timers.
+
+
+ holdtime + +
+ integer +
+
+ +
Hold time in secs.
+
+
+ keepalive + +
+ integer +
+
+ +
Keep Alive Interval in secs.
+
+
+ transport + +
+ dictionary +
+
+ +
Configure transport options for TCP session.
+
+
+ connection_mode + +
+ string +
+
+ +
Configure connection-mode for TCP session.
+
+
+ remote_port + +
+ integer +
+
+ +
Configure BGP peer TCP port to connect to.
+
+
+ ttl + +
+ integer +
+
+ +
BGP ttl security check
+
+
+ update_source + +
+ string +
+
+ +
Specify the local source interface for peer BGP sessions.
+
+
+ weight + +
+ integer +
+
+ +
Weight to assign.
+
+
+ network + +
+ list + / elements=dictionary +
+
+ +
Configure routing for a network.
+

aliases: networks
+
+
+ address + +
+ string +
+
+ +
address prefix.
+
+
+ route_map + +
+ string +
+
+ +
Name of route map.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Redistribute routes in to BGP.
+
+
+ isis_level + +
+ string +
+
+
    Choices: +
  • level-1
  • +
  • level-2
  • +
  • level-1-2
  • +
+
+
Applicable for isis routes. Specify isis route level.
+
+
+ ospf_route + +
+ string +
+
+
    Choices: +
  • internal
  • +
  • external
  • +
  • nssa_external_1
  • +
  • nssa_external_2
  • +
+
+
ospf route options.
+
+
+ protocol + +
+ string +
+
+
    Choices: +
  • isis
  • +
  • ospfv3
  • +
  • ospf
  • +
  • attached-host
  • +
  • connected
  • +
  • rip
  • +
  • static
  • +
+
+
Routes to be redistributed.
+
+
+ route_map + +
+ string +
+
+ +
Route map reference.
+
+
+ route_target + +
+ dictionary +
+
+ +
Route target.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • both
  • +
  • import
  • +
  • export
  • +
+
+
Route action.
+
+
+ target + +
+ string +
+
+ +
Route Target.
+
+
+ router_id + +
+ string +
+
+ +
Router id.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, shut down BGP.
+
+
+ timers + +
+ dictionary +
+
+ +
Timers.
+
+
+ holdtime + +
+ integer +
+
+ +
Hold time in secs.
+
+
+ keepalive + +
+ integer +
+
+ +
Keep Alive Interval in secs.
+
+
+ ucmp + +
+ dictionary +
+
+ +
Configure unequal cost multipathing.
+
+
+ fec + +
+ dictionary +
+
+ +
Configure UCMP fec utilization threshold.
+
+
+ clear + +
+ integer +
+
+ +
UCMP FEC utilization Clear thresholds.
+
+
+ trigger + +
+ integer +
+
+ +
UCMP fec utilization too high threshold.
+
+
+ link_bandwidth + +
+ dictionary +
+
+ +
Configure link-bandwidth propagation delay.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • encoding_weighted
  • +
  • recursive
  • +
+
+
UCMP link bandwidth mode
+
+
+ update_delay + +
+ integer +
+
+ +
Link Bandwidth Advertisement delay.
+
+
+ mode + +
+ dictionary +
+
+ +
UCMP mode.
+
+
+ nexthops + +
+ integer +
+
+ +
Value for total number UCMP nexthops.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, ucmp mode is set to 1.
+
+
+ update + +
+ dictionary +
+
+ +
Configure BGP update generation.
+
+
+ batch_size + +
+ integer +
+
+ +
batch size for FIB route acknowledgements.
+
+
+ wait_for + +
+ string +
+
+
    Choices: +
  • wait_for_convergence
  • +
  • wait_install
  • +
+
+
wait for options before converge or synchronize.
+
+
+ vlan + +
+ integer +
+
+ +
Configure MAC VRF BGP for single VLAN support.
+
+
+ vlan_aware_bundle + +
+ string +
+
+ +
Configure MAC VRF BGP for multiple VLAN support.
+
+
+ vrfs + +
+ list + / elements=dictionary +
+
+ +
Configure BGP in a VRF.
+
+
+ access_group + +
+ list + / elements=dictionary +
+
+ +
ip/ipv6 access list configuration.
+
+
+ acl_name + +
+ string +
+
+ +
access list name.
+
+
+ afi + +
+ string +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Specify ip/ipv6.
+
+
+ direction + +
+ string +
+
+ +
direction of packets.
+
+
+ aggregate_address + +
+ list + / elements=dictionary +
+
+ +
Configure aggregate address.
+
+
+ address + +
+ string +
+
+ +
ipv4/ipv6 address prefix.
+
+
+ advertise_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise without installing the generated blackhole route in FIB.
+
+
+ as_set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Generate autonomous system set path information.
+
+
+ attribute_map + +
+ string +
+
+ +
Name of the route map used to set the attribute of the aggregate route.
+
+
+ match_map + +
+ string +
+
+ +
Name of the route map used to filter the contributors of the aggregate route.
+
+
+ summary_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Filters all more-specific routes from updates.
+
+
+ bgp_params + +
+ dictionary +
+
+ +
BGP parameters.
+
+
+ additional_paths + +
+ string +
+
+
    Choices: +
  • install
  • +
  • send
  • +
  • receive
  • +
+
+
BGP additional-paths commands
+
+
+ advertise_inactive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Advertise BGP routes even if they are inactive in RIB.
+
+
+ allowas_in + +
+ dictionary +
+
+ +
Allow local-as in updates.
+
+
+ count + +
+ integer +
+
+ +
Number of local ASNs allowed in a BGP update.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, it is set.
+
+
+ always_compare_med + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
BGP Always Compare MED
+
+
+ asn + +
+ string +
+
+
    Choices: +
  • asdot
  • +
  • asplain
  • +
+
+
AS Number notation.
+
+
+ auto_local_addr + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Automatically determine the local address to be used for the non-transport AF.
+
+
+ bestpath + +
+ dictionary +
+
+ +
Select the bestpath selection algorithim for BGP routes.
+
+
+ as_path + +
+ string +
+
+
    Choices: +
  • ignore
  • +
  • multipath_relax
  • +
+
+
Select the bestpath selection based on as-path.
+
+
+ ecmp_fast + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Tie-break BGP paths in a ECMP group based on the order of arrival.
+
+
+ med + +
+ dictionary +
+
+ +
MED attribute
+
+
+ confed + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
MED Confed.
+
+
+ missing_as_worst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
MED missing-as-worst.
+
+
+ skip + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
skip one of the tie breaking rules in the bestpath selection.
+
+
+ tie_break + +
+ string +
+
+
    Choices: +
  • cluster_list_length
  • +
  • router_id
  • +
+
+
Configure the tie-break option for BGP bestpath selection.
+
+
+ client_to_client + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
client to client configuration.
+
+
+ cluster_id + +
+ string +
+
+ +
Cluster ID of this router acting as a route reflector.
+
+
+ confederation + +
+ dictionary +
+
+ +
confederation.
+
+
+ identifier + +
+ string +
+
+ +
Confederation identifier.
+
+
+ peers + +
+ string +
+
+ +
Confederation peers.
+
+
+ control_plane_filter + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Control plane filter for BGP.
+
+
+ convergence + +
+ dictionary +
+
+ +
Bgp convergence parameters.
+
+
+ slow_peer + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Maximum amount of time to wait for slow peers to estabilsh session.
+
+
+ time + +
+ integer +
+
+ +
time in secs
+
+
+ default + +
+ string +
+
+
    Choices: +
  • ipv4_unicast
  • +
  • ipv6_unicast
  • +
+
+
Default neighbor configuration commands.
+
+
+ enforce_first_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enforce the First AS for EBGP routes(default).
+
+
+ host_routes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
BGP host routes configuration.
+
+
+ labeled_unicast + +
+ string +
+
+
    Choices: +
  • ip
  • +
  • tunnel
  • +
+
+
Labeled Unicast.
+
+
+ listen + +
+ dictionary +
+
+ +
BGP listen.
+
+
+ limit + +
+ integer +
+
+ +
Set limit on the number of dynamic BGP peers allowed.
+
+
+ range + +
+ dictionary +
+
+ +
Subnet Range to be associated with the peer group.
+
+
+ address + +
+ string +
+
+ +
Address prefix
+
+
+ peer_group + +
+ dictionary +
+
+ +
Name of peer group.
+
+
+ name + +
+ string +
+
+ +
name.
+
+
+ peer_filter + +
+ string +
+
+ +
Name of peer filter.
+
+
+ remote_as + +
+ string +
+
+ +
Neighbor AS number
+
+
+ log_neighbor_changes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Log neighbor up/down events.
+
+
+ missing_policy + +
+ dictionary +
+
+ +
Missing policy override configuration commands.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • deny
  • +
  • permit
  • +
  • deny-in-out
  • +
+
+
Missing policy action options.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Missing policy direction options.
+
+
+ monitoring + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable Bgp monitoring for all/specified stations.
+
+
+ next_hop_unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Preserve original nexthop while advertising routes to eBGP peers.
+
+
+ redistribute_internal + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Redistribute internal BGP routes.
+
+
+ route + +
+ string +
+
+ +
Configure route-map for route installation.
+
+
+ route_reflector + +
+ dictionary +
+
+ +
Configure route reflector options
+
+
+ preserve + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
preserve route attributes, overwriting route-map changes
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True route_reflector is set.
+
+
+ transport + +
+ integer +
+
+ +
Configure transport port for TCP session
+
+
+ default_metric + +
+ integer +
+
+ +
Default metric.
+
+
+ distance + +
+ dictionary +
+
+ +
Define an administrative distance.
+
+
+ external + +
+ integer +
+
+ +
distance for external routes.
+
+
+ internal + +
+ integer +
+
+ +
distance for internal routes.
+
+
+ local + +
+ integer +
+
+ +
distance for local routes.
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Enable graceful restart mode.
+
+
+ restart_time + +
+ integer +
+
+ +
Set the max time needed to restart and come back up.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, graceful restart is set.
+
+
+ stalepath_time + +
+ integer +
+
+ +
Set the max time to hold onto restarting peer stale paths.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart helper mode.
+
+
+ maximum_paths + +
+ dictionary +
+
+ +
Maximum number of equal cost paths.
+
+
+ max_equal_cost_paths + +
+ integer +
+
+ +
Value for maximum number of equal cost paths.
+
+
+ max_installed_ecmp_paths + +
+ integer +
+
+ +
Value for maximum number of installed ECMP routes.
+
+
+ neighbor + +
+ list + / elements=dictionary +
+
+ +
Configure routing for a network.
+

aliases: neighbors
+
+
+ additional_paths + +
+ string +
+
+
    Choices: +
  • send
  • +
  • receive
  • +
+
+
BGP additional-paths commands.
+
+
+ allowas_in + +
+ dictionary +
+
+ +
Allow local-as in updates.
+
+
+ count + +
+ integer +
+
+ +
Number of local ASNs allowed in a BGP update.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, it is set.
+
+
+ auto_local_addr + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Automatically determine the local address to be used for the non-transport AF.
+
+
+ bfd + +
+ string +
+
+
    Choices: +
  • enable
  • +
  • c_bit
  • +
+
+
Configure BFD fallover for this peer
+
+
+ default_originate + +
+ dictionary +
+
+ +
Originate default route to this neighbor.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always originate default route to this neighbor.
+
+
+ route_map + +
+ string +
+
+ +
Route map reference.
+
+
+ description + +
+ string +
+
+ +
Text describing the neighbor.
+
+
+ dont_capability_negotiate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Donot perform Capability Negotiation with this neighbor.
+
+
+ ebgp_multihop + +
+ dictionary +
+
+ +
Allow BGP connections to indirectly connected external peers.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, ttl is not set.
+
+
+ ttl + +
+ integer +
+
+ +
Time-to-live in the range 1-255 hops.
+
+
+ encryption_password + +
+ dictionary +
+
+ +
Password to use in computation of MD5 hash.
+
+
+ password + +
+ string +
+
+ +
password (up to 80 chars).
+
+
+ type + +
+ integer +
+
+
    Choices: +
  • 0
  • +
  • 7
  • +
+
+
Encryption type.
+
+
+ enforce_first_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enforce the First AS for EBGP routes(default).
+
+
+ export_localpref + +
+ integer +
+
+ +
Override localpref when exporting to an internal peer.
+
+
+ fall_over + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure BFD protocol options for this peer.
+
+
+ graceful_restart + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart mode.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable graceful restart helper mode.
+
+
+ idle_restart_timer + +
+ integer +
+
+ +
Neighbor idle restart timer.
+
+
+ import_localpref + +
+ integer +
+
+ +
Override localpref when importing from an external peer.
+
+
+ link_bandwidth + +
+ dictionary +
+
+ +
Enable link bandwidth community for routes to this peer.
+
+
+ auto + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable link bandwidth auto generation for routes from this peer.
+
+
+ default + +
+ string +
+
+ +
Enable link bandwidth default generation for routes from this peer.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, set link bandwidth
+
+
+ update_delay + +
+ integer +
+
+ +
Delay outbound route updates.
+
+
+ local_as + +
+ dictionary +
+
+ +
Configure local AS number advertised to peer.
+
+
+ as_number + +
+ string +
+
+ +
AS number.
+
+
+ fallback + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Prefer router AS Number over local AS Number.
+
+
+ local_v6_addr + +
+ string +
+
+ +
The local IPv6 address of the neighbor in A:B:C:D:E:F:G:H format.
+
+
+ maximum_accepted_routes + +
+ dictionary +
+
+ +
Maximum number of routes accepted from this peer.
+
+
+ count + +
+ integer +
+
+ +
Maximum number of accepted routes (0 means unlimited).
+
+
+ warning_limit + +
+ integer +
+
+ +
Maximum number of accepted routes after which a warning is issued. (0 means never warn)
+
+
+ maximum_received_routes + +
+ dictionary +
+
+ +
Maximum number of routes received from this peer.
+
+
+ count + +
+ integer +
+
+ +
Maximum number of routes (0 means unlimited).
+
+
+ warning_limit + +
+ dictionary +
+
+ +
Percentage of maximum-routes at which warning is to be issued.
+
+
+ limit_count + +
+ integer +
+
+ +
Number of routes at which to warn.
+
+
+ limit_percent + +
+ integer +
+
+ +
Percentage of maximum number of routes at which to warn( 1-100).
+
+
+ warning_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Only warn, no restart, if max route limit exceeded.
+
+
+ metric_out + +
+ integer +
+
+ +
MED value to advertise to peer.
+
+
+ monitoring + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BGP Monitoring Protocol for this peer.
+
+
+ neighbor_address + +
+ string +
+
+ +
Neighbor address or peer group.
+

aliases: peer
+
+
+ next_hop_self + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always advertise this router address as the BGP next hop
+
+
+ next_hop_unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Preserve original nexthop while advertising routes to eBGP peers.
+
+
+ next_hop_v6_address + +
+ string +
+
+ +
IPv6 next-hop address for the neighbor
+
+
+ out_delay + +
+ integer +
+
+ +
Delay outbound route updates.
+
+
+ peer_group + +
+ string +
+
+ +
Name of the peer group.
+
+
+ prefix_list + +
+ dictionary +
+
+ +
Prefix list reference.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Configure an inbound/outbound prefix-list.
+
+
+ name + +
+ string +
+
+ +
prefix list name.
+
+
+ remote_as + +
+ string +
+
+ +
Neighbor Autonomous System.
+
+
+ remove_private_as + +
+ dictionary +
+
+ +
Remove private AS number from updates to this peer.
+
+
+ all + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove private AS number.
+
+
+ replace_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Replace private AS number with local AS number.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, set remove_private_as.
+
+
+ route_map + +
+ dictionary +
+
+ +
Route map reference.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
Configure an inbound/outbound route-map.
+
+
+ name + +
+ string +
+
+ +
Route map name.
+
+
+ route_reflector_client + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure peer as a route reflector client.
+
+
+ route_to_peer + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use routing table information to reach the peer.
+
+
+ send_community + +
+ dictionary +
+
+ +
Send community attribute to this neighbor.
+
+
+ community_attribute + +
+ string +
+
+ +
Type of community attributes to send to this neighbor.
+
+
+ divide + +
+ string +
+
+
    Choices: +
  • equal
  • +
  • ratio
  • +
+
+
link-bandwidth divide attribute.
+
+
+ link_bandwidth_attribute + +
+ string +
+
+
    Choices: +
  • aggregate
  • +
  • divide
  • +
+
+
cumulative/aggregate attribute to be sent.
+
+
+ speed + +
+ string +
+
+ +
Reference link speed in bits/second
+
+
+ sub_attribute + +
+ string +
+
+
    Choices: +
  • extended
  • +
  • link-bandwidth
  • +
  • standard
  • +
+
+
Attribute to be sent to the neighbor.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shut down this neighbor.
+
+
+ soft_recognition + +
+ string +
+
+
    Choices: +
  • all
  • +
  • None
  • +
+
+
Configure how to handle routes that fail import.
+
+
+ timers + +
+ dictionary +
+
+ +
Timers.
+
+
+ holdtime + +
+ integer +
+
+ +
Hold time in secs.
+
+
+ keepalive + +
+ integer +
+
+ +
Keep Alive Interval in secs.
+
+
+ transport + +
+ dictionary +
+
+ +
Configure transport options for TCP session.
+
+
+ connection_mode + +
+ string +
+
+ +
Configure connection-mode for TCP session.
+
+
+ remote_port + +
+ integer +
+
+ +
Configure BGP peer TCP port to connect to.
+
+
+ ttl + +
+ integer +
+
+ +
BGP ttl security check
+
+
+ update_source + +
+ string +
+
+ +
Specify the local source interface for peer BGP sessions.
+
+
+ weight + +
+ integer +
+
+ +
Weight to assign.
+
+
+ network + +
+ list + / elements=dictionary +
+
+ +
Configure routing for a network.
+

aliases: networks
+
+
+ address + +
+ string +
+
+ +
address prefix.
+
+
+ route_map + +
+ string +
+
+ +
Name of route map.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Redistribute routes in to BGP.
+
+
+ isis_level + +
+ string +
+
+
    Choices: +
  • level-1
  • +
  • level-2
  • +
  • level-1-2
  • +
+
+
Applicable for isis routes. Specify isis route level.
+
+
+ ospf_route + +
+ string +
+
+
    Choices: +
  • internal
  • +
  • external
  • +
  • nssa_external_1
  • +
  • nssa_external_2
  • +
+
+
ospf route options.
+
+
+ protocol + +
+ string +
+
+
    Choices: +
  • isis
  • +
  • ospfv3
  • +
  • ospf
  • +
  • attached-host
  • +
  • connected
  • +
  • rip
  • +
  • static
  • +
+
+
Routes to be redistributed.
+
+
+ route_map + +
+ string +
+
+ +
Route map reference.
+
+
+ route_target + +
+ dictionary +
+
+ +
Route target.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • both
  • +
  • import
  • +
  • export
  • +
+
+
Route action.
+
+
+ imported_route + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Export routes imported from the same Afi/Safi.
+
+
+ route_map + +
+ string +
+
+ +
Name of a route map.
+
+
+ target + +
+ string +
+
+ +
Route Target.
+
+
+ type + +
+ string +
+
+
    Choices: +
  • evpn
  • +
  • vpn-ipv4
  • +
  • vpn-ipv6
  • +
+
+
Type of address fmaily
+
+
+ router_id + +
+ string +
+
+ +
Router id.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When True, shut down BGP.
+
+
+ timers + +
+ dictionary +
+
+ +
Timers.
+
+
+ holdtime + +
+ integer +
+
+ +
Hold time in secs.
+
+
+ keepalive + +
+ integer +
+
+ +
Keep Alive Interval in secs.
+
+
+ ucmp + +
+ dictionary +
+
+ +
Configure unequal cost multipathing.
+
+
+ fec + +
+ dictionary +
+
+ +
Configure UCMP fec utilization threshold.
+
+
+ clear + +
+ integer +
+
+ +
UCMP FEC utilization Clear thresholds.
+
+
+ trigger + +
+ integer +
+
+ +
UCMP fec utilization too high threshold.
+
+
+ link_bandwidth + +
+ dictionary +
+
+ +
Configure link-bandwidth propagation delay.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • encoding_weighted
  • +
  • recursive
  • +
  • update_delay
  • +
+
+
UCMP link bandwidth mode
+
+
+ update_delay + +
+ integer +
+
+ +
Link Bandwidth Advertisement delay.
+
+
+ mode + +
+ dictionary +
+
+ +
UCMP mode.
+
+
+ nexthops + +
+ integer +
+
+ +
Value for total number UCMP nexthops.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, ucmp mode is set to 1.
+
+
+ update + +
+ dictionary +
+
+ +
Configure BGP update generation.
+
+
+ batch_size + +
+ integer +
+
+ +
batch size for FIB route acknowledgements.
+
+
+ wait_for + +
+ string +
+
+
    Choices: +
  • wait_for_convergence
  • +
  • wait_install
  • +
+
+
wait for options before converge or synchronize.
+
+
+ vrf + +
+ string +
+
+ +
VRF name.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section bgp.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • purged
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
State purged removes all the BGP configurations from the target device. Use caution with this state.('no router bgp <x>')
+
State deleted only removes BGP attributes that this modules manages and does not negate the BGP process completely. Thereby, preserving address-family related configurations under BGP context.
+
Running states deleted and replaced will result in an error if there are address-family configuration lines present under vrf context that is is to be removed. Please use the arista.eos.eos_bgp_address_family module for prior cleanup.
+
Refer to examples for more details.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + # Before state + + # veos(config)#show running-config | section bgp + # veos(config)# + + - name: Merge provided configuration with device configuration + arista.eos.eos_bgp_global: + config: + as_number: "100" + bgp_params: + host_routes: True + convergence: + slow_peer: True + time: 6 + additional_paths: "send" + log_neighbor_changes: True + maximum_paths: + max_equal_cost_paths: 55 + aggregate_address: + - address: "1.2.1.0/24" + as_set: true + match_map: "match01" + - address: "5.2.1.0/24" + attribute_map: "attrmatch01" + advertise_only: true + redistribute: + - protocol: "static" + route_map: "map_static" + - protocol: "attached-host" + distance: + internal: 50 + neighbor: + - peer: "10.1.3.2" + allowas_in: + set: true + default_originate: + always: true + dont_capability_negotiate: true + export_localpref: 4000 + maximum_received_routes: + count: 500 + warning_limit: + limit_percent: 5 + next_hop_unchanged: true + prefix_list: + name: "prefix01" + direction: "out" + - neighbor_address: "peer1" + fall_over: true + link_bandwidth: + update_delay: 5 + monitoring: True + send_community: + community_attribute: "extended" + sub_attribute: "link-bandwidth" + link_bandwidth_attribute: "aggregate" + speed: "600" + vlan: 5 + state: merged + + # After State: + # veos(config)#show running-config | section bgp + # router bgp 100 + # bgp convergence slow-peer time 6 + # distance bgp 50 50 50 + # maximum-paths 55 + # bgp additional-paths send any + # neighbor peer1 peer group + # neighbor peer1 link-bandwidth update-delay 5 + # neighbor peer1 fall-over bfd + # neighbor peer1 monitoring + # neighbor peer1 send-community extended link-bandwidth aggregate 600 + # neighbor peer1 maximum-routes 12000 + # neighbor 10.1.3.2 export-localpref 4000 + # neighbor 10.1.3.2 next-hop-unchanged + # neighbor 10.1.3.2 dont-capability-negotiate + # neighbor 10.1.3.2 allowas-in 3 + # neighbor 10.1.3.2 default-originate always + # neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent + # aggregate-address 1.2.1.0/24 as-set match-map match01 + # aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only + # redistribute static route-map map_static + # redistribute attached-host + # ! + # vlan 5 + # ! + # address-family ipv4 + # neighbor 10.1.3.2 prefix-list prefix01 out + # veos(config)# + # + # Module Execution: + # + # "after": { + # "aggregate_address": [ + # { + # "address": "1.2.1.0/24", + # "as_set": true, + # "match_map": "match01" + # }, + # { + # "address": "5.2.1.0/24", + # "advertise_only": true, + # "attribute_map": "attrmatch01" + # } + # ], + # "as_number": "100", + # "bgp_params": { + # "additional_paths": "send", + # "convergence": { + # "slow_peer": true, + # "time": 6 + # } + # }, + # "distance": { + # "external": 50, + # "internal": 50, + # "local": 50 + # }, + # "maximum_paths": { + # "max_equal_cost_paths": 55 + # }, + # "neighbor": [ + # { + # "fall_over": true, + # "link_bandwidth": { + # "set": true, + # "update_delay": 5 + # }, + # "maximum_received_routes": { + # "count": 12000 + # }, + # "monitoring": true, + # "peer": "peer1", + # "peer_group": "peer1", + # "send_community": { + # "community_attribute": "extended", + # "link_bandwidth_attribute": "aggregate", + # "speed": "600", + # "sub_attribute": "link-bandwidth" + # } + # }, + # { + # "allowas_in": { + # "count": 3 + # }, + # "default_originate": { + # "always": true + # }, + # "dont_capability_negotiate": true, + # "export_localpref": 4000, + # "maximum_received_routes": { + # "count": 500, + # "warning_limit": { + # "limit_percent": 5 + # } + # }, + # "next_hop_unchanged": true, + # "peer": "10.1.3.2" + # } + # ], + # "redistribute": [ + # { + # "protocol": "static", + # "route_map": "map_static" + # }, + # { + # "protocol": "attached-host" + # } + # ], + # "vlan": 5 + # }, + # "before": {}, + # "changed": true, + # "commands": [ + # "router bgp 100", + # "neighbor 10.1.3.2 allowas-in", + # "neighbor 10.1.3.2 default-originate always", + # "neighbor 10.1.3.2 dont-capability-negotiate", + # "neighbor 10.1.3.2 export-localpref 4000", + # "neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent", + # "neighbor 10.1.3.2 next-hop-unchanged", + # "neighbor 10.1.3.2 prefix-list prefix01 out", + # "neighbor peer1 fall-over bfd", + # "neighbor peer1 link-bandwidth update-delay 5", + # "neighbor peer1 monitoring", + # "neighbor peer1 send-community extended link-bandwidth aggregate 600", + # "redistribute static route-map map_static", + # "redistribute attached-host", + # "aggregate-address 1.2.1.0/24 as-set match-map match01", + # "aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only", + # "bgp host-routes fib direct-install", + # "bgp convergence slow-peer time 6", + # "bgp additional-paths send any", + # "bgp log-neighbor-changes", + # "maximum-paths 55", + # "distance bgp 50", + # "vlan 5" + # ], + + # Using replaced: + + # Before state: + # veos(config)#show running-config | section bgp + # router bgp 100 + # bgp convergence slow-peer time 6 + # distance bgp 50 50 50 + # maximum-paths 55 + # bgp additional-paths send any + # neighbor peer1 peer group + # neighbor peer1 link-bandwidth update-delay 5 + # neighbor peer1 fall-over bfd + # neighbor peer1 monitoring + # neighbor peer1 send-community extended link-bandwidth aggregate 600 + # neighbor peer1 maximum-routes 12000 + # neighbor 10.1.3.2 export-localpref 4000 + # neighbor 10.1.3.2 next-hop-unchanged + # neighbor 10.1.3.2 dont-capability-negotiate + # neighbor 10.1.3.2 allowas-in 3 + # neighbor 10.1.3.2 default-originate always + # neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent + # aggregate-address 1.2.1.0/24 as-set match-map match01 + # aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only + # redistribute static route-map map_static + # redistribute attached-host + # ! + # vlan 5 + # ! + # address-family ipv4 + # neighbor 10.1.3.2 prefix-list prefix01 out + # ! + # vrf vrf01 + # route-target import 54:11 + # neighbor 12.1.3.2 dont-capability-negotiate + # neighbor 12.1.3.2 allowas-in 3 + # neighbor 12.1.3.2 default-originate always + # neighbor 12.1.3.2 maximum-routes 12000 + # veos(config)# + + - name: replace provided configuration with device configuration + arista.eos.eos_bgp_global: + config: + as_number: "100" + bgp_params: + host_routes: True + convergence: + slow_peer: True + time: 6 + additional_paths: "send" + log_neighbor_changes: True + vrfs: + - vrf: "vrf01" + maximum_paths: + max_equal_cost_paths: 55 + aggregate_address: + - address: "1.2.1.0/24" + as_set: true + match_map: "match01" + - address: "5.2.1.0/24" + attribute_map: "attrmatch01" + advertise_only: true + redistribute: + - protocol: "static" + route_map: "map_static" + - protocol: "attached-host" + distance: + internal: 50 + neighbor: + - neighbor_address: "10.1.3.2" + allowas_in: + set: true + default_originate: + always: true + dont_capability_negotiate: true + export_localpref: 4000 + maximum_received_routes: + count: 500 + warning_limit: + limit_percent: 5 + next_hop_unchanged: true + prefix_list: + name: "prefix01" + direction: "out" + - neighbor_address: "peer1" + fall_over: true + link_bandwidth: + update_delay: 5 + monitoring: True + send_community: + community_attribute: "extended" + sub_attribute: "link-bandwidth" + link_bandwidth_attribute: "aggregate" + speed: "600" + state: replaced + + # After State: + + # veos(config)#show running-config | section bgp + # router bgp 100 + # bgp convergence slow-peer time 6 + # bgp additional-paths send any + # ! + # vrf vrf01 + # distance bgp 50 50 50 + # maximum-paths 55 + # neighbor 10.1.3.2 export-localpref 4000 + # neighbor 10.1.3.2 next-hop-unchanged + # neighbor 10.1.3.2 dont-capability-negotiate + # neighbor 10.1.3.2 allowas-in 3 + # neighbor 10.1.3.2 default-originate always + # neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent + # aggregate-address 1.2.1.0/24 as-set match-map match01 + # aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only + # redistribute static route-map map_static + # redistribute attached-host + # ! + # address-family ipv4 + # neighbor 10.1.3.2 prefix-list prefix01 out + # veos(config)# + # + # + # Module Execution: + # + # "after": { + # "as_number": "100", + # "bgp_params": { + # "additional_paths": "send", + # "convergence": { + # "slow_peer": true, + # "time": 6 + # } + # }, + # "vrfs": [ + # { + # "aggregate_address": [ + # { + # "address": "1.2.1.0/24", + # "as_set": true, + # "match_map": "match01" + # }, + # { + # "address": "5.2.1.0/24", + # "advertise_only": true, + # "attribute_map": "attrmatch01" + # } + # ], + # "distance": { + # "external": 50, + # "internal": 50, + # "local": 50 + # }, + # "maximum_paths": { + # "max_equal_cost_paths": 55 + # }, + # "neighbor": [ + # { + # "allowas_in": { + # "count": 3 + # }, + # "default_originate": { + # "always": true + # }, + # "dont_capability_negotiate": true, + # "export_localpref": 4000, + # "maximum_received_routes": { + # "count": 500, + # "warning_limit": { + # "limit_percent": 5 + # } + # }, + # "next_hop_unchanged": true, + # "peer": "10.1.3.2" + # } + # ], + # "redistribute": [ + # { + # "protocol": "static", + # "route_map": "map_static" + # }, + # { + # "protocol": "attached-host" + # } + # ], + # "vrf": "vrf01" + # } + # ] + # }, + # "before": { + # "aggregate_address": [ + # { + # "address": "1.2.1.0/24", + # "as_set": true, + # "match_map": "match01" + # }, + # { + # "address": "5.2.1.0/24", + # "advertise_only": true, + # "attribute_map": "attrmatch01" + # } + # ], + # "as_number": "100", + # "bgp_params": { + # "additional_paths": "send", + # "convergence": { + # "slow_peer": true, + # "time": 6 + # } + # }, + # "distance": { + # "external": 50, + # "internal": 50, + # "local": 50 + # }, + # "maximum_paths": { + # "max_equal_cost_paths": 55 + # }, + # "neighbor": [ + # { + # "fall_over": true, + # "link_bandwidth": { + # "set": true, + # "update_delay": 5 + # }, + # "maximum_received_routes": { + # "count": 12000 + # }, + # "monitoring": true, + # "peer": "peer1", + # "peer_group": "peer1", + # "send_community": { + # "community_attribute": "extended", + # "link_bandwidth_attribute": "aggregate", + # "speed": "600", + # "sub_attribute": "link-bandwidth" + # } + # }, + # { + # "allowas_in": { + # "count": 3 + # }, + # "default_originate": { + # "always": true + # }, + # "dont_capability_negotiate": true, + # "export_localpref": 4000, + # "maximum_received_routes": { + # "count": 500, + # "warning_limit": { + # "limit_percent": 5 + # } + # }, + # "next_hop_unchanged": true, + # "peer": "10.1.3.2" + # } + # ], + # "redistribute": [ + # { + # "protocol": "static", + # "route_map": "map_static" + # }, + # { + # "protocol": "attached-host" + # } + # ], + # "vlan": 5, + # "vrfs": [ + # { + # "neighbor": [ + # { + # "allowas_in": { + # "count": 3 + # }, + # "default_originate": { + # "always": true + # }, + # "dont_capability_negotiate": true, + # "maximum_received_routes": { + # "count": 12000 + # }, + # "peer": "12.1.3.2" + # } + # ], + # "route_target": { + # "action": "import", + # "target": "54:11" + # }, + # "vrf": "vrf01" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "router bgp 100", + # "vrf vrf01", + # "no route-target import 54:11", + # "neighbor 10.1.3.2 allowas-in", + # "neighbor 10.1.3.2 default-originate always", + # "neighbor 10.1.3.2 dont-capability-negotiate", + # "neighbor 10.1.3.2 export-localpref 4000", + # "neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent", + # "neighbor 10.1.3.2 next-hop-unchanged", + # "neighbor 10.1.3.2 prefix-list prefix01 out", + # "neighbor peer1 fall-over bfd", + # "neighbor peer1 link-bandwidth update-delay 5", + # "neighbor peer1 monitoring", + # "neighbor peer1 send-community extended link-bandwidth aggregate 600", + # "no neighbor 12.1.3.2", + # "redistribute static route-map map_static", + # "redistribute attached-host", + # "aggregate-address 1.2.1.0/24 as-set match-map match01", + # "aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only", + # "maximum-paths 55", + # "distance bgp 50", + # "exit", + # "no neighbor peer1 peer group", + # "no neighbor peer1 link-bandwidth update-delay 5", + # "no neighbor peer1 fall-over bfd", + # "no neighbor peer1 monitoring", + # "no neighbor peer1 send-community extended link-bandwidth aggregate 600", + # "no neighbor peer1 maximum-routes 12000", + # "no neighbor 10.1.3.2", + # "no redistribute static route-map map_static", + # "no redistribute attached-host", + # "no aggregate-address 1.2.1.0/24 as-set match-map match01", + # "no aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only", + # "bgp host-routes fib direct-install", + # "bgp log-neighbor-changes", + # "no distance bgp 50 50 50", + # "no maximum-paths 55", + # "no vlan 5" + # ], + # + + # Using replaced (in presence of address_family under vrf): + # Before State: + + #veos(config)#show running-config | section bgp + # router bgp 100 + # bgp convergence slow-peer time 6 + # bgp additional-paths send any + # ! + # vrf vrf01 + # distance bgp 50 50 50 + # maximum-paths 55 + # neighbor 10.1.3.2 export-localpref 4000 + # neighbor 10.1.3.2 next-hop-unchanged + # neighbor 10.1.3.2 dont-capability-negotiate + # neighbor 10.1.3.2 allowas-in 3 + # neighbor 10.1.3.2 default-originate always + # neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent + # aggregate-address 1.2.1.0/24 as-set match-map match01 + # aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only + # redistribute static route-map map_static + # redistribute attached-host + # ! + # address-family ipv4 + # neighbor 10.1.3.2 prefix-list prefix01 out + # ! + # address-family ipv6 + # redistribute dhcp + # veos(config)# + + - name: Replace + arista.eos.eos_bgp_global: + config: + as_number: "100" + graceful_restart: + set: True + router_id: "1.1.1.1" + timers: + keepalive: 2 + holdtime: 5 + ucmp: + mode: + set: True + vlan_aware_bundle: "bundle1 bundle2 bundle3" + state: replaced + + # Module Execution: + + # fatal: [192.168.122.113]: FAILED! => { + # "changed": false, + # "invocation": { + # "module_args": { + # "config": { + # "access_group": null, + # "aggregate_address": null, + # "as_number": "100", + # "bgp_params": null, + # "default_metric": null, + # "distance": null, + # "graceful_restart": { + # "restart_time": null, + # "set": true, + # "stalepath_time": null + # }, + # "graceful_restart_helper": null, + # "maximum_paths": null, + # "monitoring": null, + # "neighbor": null, + # "network": null, + # "redistribute": null, + # "route_target": null, + # "router_id": "1.1.1.1", + # "shutdown": null, + # "timers": { + # "holdtime": 5, + # "keepalive": 2 + # }, + # "ucmp": { + # "fec": null, + # "link_bandwidth": null, + # "mode": { + # "nexthops": null, + # "set": true + # } + # }, + # "update": null, + # "vlan": null, + # "vlan_aware_bundle": "bundle1 bundle2 bundle3", + # "vrfs": null + # }, + # "running_config": null, + # "state": "replaced" + # } + # }, + # "msg": "Use the _bgp_af module to delete the address_family under vrf, before replacing/deleting the vrf." + # } + + # Using deleted: + + # Before state: + + # veos(config)#show running-config | section bgp + # router bgp 100 + # bgp convergence slow-peer time 6 + # bgp additional-paths send any + # ! + # vrf vrf01 + # distance bgp 50 50 50 + # maximum-paths 55 + # neighbor 10.1.3.2 export-localpref 4000 + # neighbor 10.1.3.2 next-hop-unchanged + # neighbor 10.1.3.2 dont-capability-negotiate + # neighbor 10.1.3.2 allowas-in 3 + # neighbor 10.1.3.2 default-originate always + # neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent + # aggregate-address 1.2.1.0/24 as-set match-map match01 + # aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only + # redistribute static route-map map_static + # redistribute attached-host + # ! + + - name: Delete configuration + arista.eos.eos_bgp_global: + config: + as_number: "100" + state: deleted + + # After State: + + # veos(config)#show running-config | section bgp + # router bgp 100 + # + # + # Module Execution: + # + # "after": { + # "as_number": "100" + # }, + # "before": { + # "as_number": "100", + # "bgp_params": { + # "additional_paths": "send", + # "convergence": { + # "slow_peer": true, + # "time": 6 + # } + # }, + # "vrfs": [ + # { + # "aggregate_address": [ + # { + # "address": "1.2.1.0/24", + # "as_set": true, + # "match_map": "match01" + # }, + # { + # "address": "5.2.1.0/24", + # "advertise_only": true, + # "attribute_map": "attrmatch01" + # } + # ], + # "distance": { + # "external": 50, + # "internal": 50, + # "local": 50 + # }, + # "maximum_paths": { + # "max_equal_cost_paths": 55 + # }, + # "neighbor": [ + # { + # "allowas_in": { + # "count": 3 + # }, + # "default_originate": { + # "always": true + # }, + # "dont_capability_negotiate": true, + # "export_localpref": 4000, + # "maximum_received_routes": { + # "count": 500, + # "warning_limit": { + # "limit_percent": 5 + # } + # }, + # "next_hop_unchanged": true, + # "peer": "10.1.3.2" + # } + # ], + # "redistribute": [ + # { + # "protocol": "static", + # "route_map": "map_static" + # }, + # { + # "protocol": "attached-host" + # } + # ], + # "vrf": "vrf01" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "router bgp 100", + # "no vrf vrf01", + # "no bgp convergence slow-peer time 6", + # "no bgp additional-paths send any" + # ], + # + + # Using purged: + + # Before state: + + # veos(config)#show running-config | section bgp + # router bgp 100 + # bgp convergence slow-peer time 6 + # distance bgp 50 50 50 + # maximum-paths 55 + # bgp additional-paths send any + # neighbor peer1 peer group + # neighbor peer1 link-bandwidth update-delay 5 + # neighbor peer1 fall-over bfd + # neighbor peer1 monitoring + # neighbor peer1 send-community extended link-bandwidth aggregate 600 + # neighbor peer1 maximum-routes 12000 + # neighbor 10.1.3.2 export-localpref 4000 + # neighbor 10.1.3.2 next-hop-unchanged + # neighbor 10.1.3.2 dont-capability-negotiate + # neighbor 10.1.3.2 allowas-in 3 + # neighbor 10.1.3.2 default-originate always + # neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent + # aggregate-address 1.2.1.0/24 as-set match-map match01 + # aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only + # redistribute static route-map map_static + # redistribute attached-host + # ! + # vlan 5 + # ! + # address-family ipv4 + # neighbor 10.1.3.2 prefix-list prefix01 out + # ! + # vrf vrf01 + # route-target import 54:11 + # neighbor 12.1.3.2 dont-capability-negotiate + # neighbor 12.1.3.2 allowas-in 3 + # neighbor 12.1.3.2 default-originate always + # neighbor 12.1.3.2 maximum-routes 12000 + # veos(config)# + + - name: Purge configuration + arista.eos.eos_bgp_global: + config: + as_number: "100" + state: purged + + # After State: + + # veos(config)#show running-config | section bgp + # veos(config)# + + # Module Execution: + + # "after": {}, + # "before": { + # "aggregate_address": [ + # { + # "address": "1.2.1.0/24", + # "as_set": true, + # "match_map": "match01" + # }, + # { + # "address": "5.2.1.0/24", + # "advertise_only": true, + # "attribute_map": "attrmatch01" + # } + # ], + # "as_number": "100", + # "bgp_params": { + # "additional_paths": "send", + # "convergence": { + # "slow_peer": true, + # "time": 6 + # } + # }, + # "distance": { + # "external": 50, + # "internal": 50, + # "local": 50 + # }, + # "maximum_paths": { + # "max_equal_cost_paths": 55 + # }, + # "neighbor": [ + # { + # "fall_over": true, + # "link_bandwidth": { + # "set": true, + # "update_delay": 5 + # }, + # "maximum_received_routes": { + # "count": 12000 + # }, + # "monitoring": true, + # "peer": "peer1", + # "peer_group": "peer1", + # "send_community": { + # "community_attribute": "extended", + # "link_bandwidth_attribute": "aggregate", + # "speed": "600", + # "sub_attribute": "link-bandwidth" + # } + # }, + # { + # "allowas_in": { + # "count": 3 + # }, + # "default_originate": { + # "always": true + # }, + # "dont_capability_negotiate": true, + # "export_localpref": 4000, + # "maximum_received_routes": { + # "count": 500, + # "warning_limit": { + # "limit_percent": 5 + # } + # }, + # "next_hop_unchanged": true, + # "peer": "10.1.3.2" + # } + # ], + # "redistribute": [ + # { + # "protocol": "static", + # "route_map": "map_static" + # }, + # { + # "protocol": "attached-host" + # } + # ], + # "vlan": 5, + # "vrfs": [ + # { + # "neighbor": [ + # { + # "allowas_in": { + # "count": 3 + # }, + # "default_originate": { + # "always": true + # }, + # "dont_capability_negotiate": true, + # "maximum_received_routes": { + # "count": 12000 + # }, + # "peer": "12.1.3.2" + # } + # ], + # "route_target": { + # "action": "import", + # "target": "54:11" + # }, + # "vrf": "vrf01" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "no router bgp 100" + # ], + + + + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_module.rst new file mode 100644 index 000000000..76ff60dbb --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_bgp_module.rst @@ -0,0 +1,986 @@ +.. _arista.eos.eos_bgp_module: + + +****************** +arista.eos.eos_bgp +****************** + +**(deprecated, removed after 2023-01-29) Configure global BGP protocol settings on Arista EOS.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2023-01-01 +:Why: Updated module released with more functionality. +:Alternative: eos_bgp_global + + + +Synopsis +-------- +- This module provides configuration management of global BGP parameters on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
Specifies the BGP related configuration.
+
+
+ address_family + +
+ list + / elements=dictionary +
+
+ +
Specifies BGP address family related configurations.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Type of address family to configure.
+
+
+ neighbors + +
+ list + / elements=dictionary +
+
+ +
Specifies BGP neighbor related configurations in Address Family configuration mode.
+
+
+ activate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable the Address Family for this Neighbor.
+
+
+ default_originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Originate default route to this neighbor.
+
+
+ graceful_restart + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable graceful restart mode for this neighbor.
+
+
+ neighbor + +
+ string + / required +
+
+ +
Neighbor router address.
+
+
+ weight + +
+ integer +
+
+ +
Assign weight for routes learnt from this neighbor.
+
The range is from 0 to 65535
+
+
+ networks + +
+ list + / elements=dictionary +
+
+ +
Specify Networks to announce via BGP.
+
For operation replace, this option is mutually exclusive with root level networks option.
+
+
+ masklen + +
+ integer +
+
+ +
Subnet mask length for the Network to announce(e.g, 8, 16, 24, etc.).
+
+
+ prefix + +
+ string + / required +
+
+ +
Network ID to announce via BGP.
+
+
+ route_map + +
+ string +
+
+ +
Route map to modify the attributes.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Specifies the redistribute information from another routing protocol.
+
+
+ protocol + +
+ string + / required +
+
+
    Choices: +
  • ospfv3
  • +
  • ospf
  • +
  • isis
  • +
  • static
  • +
  • connected
  • +
  • rip
  • +
+
+
Specifies the protocol for configuring redistribute information.
+
+
+ route_map + +
+ string +
+
+ +
Specifies the route map reference.
+
+
+ bgp_as + +
+ integer + / required +
+
+ +
Specifies the BGP Autonomous System (AS) number to configure on the device.
+
+
+ log_neighbor_changes + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable logging neighbor up/down and reset reason.
+
+
+ neighbors + +
+ list + / elements=dictionary +
+
+ +
Specifies BGP neighbor related configurations.
+
+
+ description + +
+ string +
+
+ +
Neighbor specific description.
+
+
+ ebgp_multihop + +
+ integer +
+
+ +
Specifies the maximum hop count for EBGP neighbors not on directly connected networks.
+
The range is from 1 to 255.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Administratively shutdown or enable a neighbor.
+
+
+ maximum_prefix + +
+ integer +
+
+ +
Maximum number of prefixes to accept from this peer.
+
The range is from 0 to 4294967294.
+
+
+ neighbor + +
+ string + / required +
+
+ +
Neighbor router address.
+
+
+ password + +
+ string +
+
+ +
Password to authenticate the BGP peer connection.
+
+
+ peer_group + +
+ string +
+
+ +
Name of the peer group that the neighbor is a member of.
+
+
+ remote_as + +
+ integer + / required +
+
+ +
Remote AS of the BGP neighbor to configure.
+
+
+ remove_private_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove the private AS number from outbound updates.
+
+
+ route_reflector_client + +
+ integer +
+
+ +
Specify a neighbor as a route reflector client.
+
+
+ timers + +
+ dictionary +
+
+ +
Specifies BGP neighbor timer related configurations.
+
+
+ holdtime + +
+ integer + / required +
+
+ +
Interval (in seconds) after not receiving a keepalive message that device declares a peer dead.
+
The range is from 3 to 7200.
+
Setting this value to 0 will not send keep-alives (hold forever).
+
+
+ keepalive + +
+ integer + / required +
+
+ +
Frequency (in seconds) with which the device sends keepalive messages to its peer.
+
The range is from 0 to 3600.
+
+
+ update_source + +
+ string +
+
+ +
Source of the routing updates.
+
+
+ networks + +
+ list + / elements=dictionary +
+
+ +
Specify Networks to announce via BGP.
+
For operation replace, this option is mutually exclusive with networks option under address_family.
+
For operation replace, if the device already has an address family activated, this option is not allowed.
+
+
+ masklen + +
+ integer +
+
+ +
Subnet mask length for the Network to announce(e.g, 8, 16, 24, etc.).
+
+
+ prefix + +
+ string + / required +
+
+ +
Network ID to announce via BGP.
+
+
+ route_map + +
+ string +
+
+ +
Route map to modify the attributes.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Specifies the redistribute information from another routing protocol.
+
+
+ protocol + +
+ string + / required +
+
+
    Choices: +
  • ospf
  • +
  • ospfv3
  • +
  • static
  • +
  • connected
  • +
  • rip
  • +
  • isis
  • +
+
+
Specifies the protocol for configuring redistribute information.
+
+
+ route_map + +
+ string +
+
+ +
Specifies the route map reference.
+
+
+ router_id + +
+ string +
+
+ +
Configures the BGP routing process router-id value.
+
+
+ operation + +
+ string +
+
+
    Choices: +
  • merge ←
  • +
  • replace
  • +
  • override
  • +
  • delete
  • +
+
+
Specifies the operation to be performed on the BGP process configured on the device.
+
In case of merge, the input configuration will be merged with the existing BGP configuration on the device.
+
In case of replace, if there is a diff between the existing configuration and the input configuration, the existing configuration will be replaced by the input configuration for every option that has the diff.
+
In case of override, all the existing BGP configuration will be removed from the device and replaced with the input configuration.
+
In case of delete the existing BGP configuration will be removed from the device.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure global bgp as 64496 + arista.eos.eos_bgp: + config: + bgp_as: 64496 + router_id: 192.0.2.1 + log_neighbor_changes: true + neighbors: + - neighbor: 203.0.113.5 + remote_as: 64511 + timers: + keepalive: 300 + holdtime: 360 + - neighbor: 198.51.100.2 + remote_as: 64498 + networks: + - prefix: 198.51.100.0 + route_map: RMAP_1 + - prefix: 192.0.2.0 + masklen: 23 + address_family: + - afi: ipv4 + safi: unicast + redistribute: + - protocol: isis + route_map: RMAP_1 + operation: merge + - name: Configure BGP neighbors + arista.eos.eos_bgp: + config: + bgp_as: 64496 + neighbors: + - neighbor: 192.0.2.10 + remote_as: 64496 + description: IBGP_NBR_1 + ebgp_multihop: 100 + timers: + keepalive: 300 + holdtime: 360 + - neighbor: 192.0.2.15 + remote_as: 64496 + description: IBGP_NBR_2 + ebgp_multihop: 150 + operation: merge + - name: Configure root-level networks for BGP + arista.eos.eos_bgp: + config: + bgp_as: 64496 + networks: + - prefix: 203.0.113.0 + masklen: 27 + route_map: RMAP_1 + - prefix: 203.0.113.32 + masklen: 27 + route_map: RMAP_2 + operation: merge + - name: Configure BGP neighbors under address family mode + arista.eos.eos_bgp: + config: + bgp_as: 64496 + address_family: + - afi: ipv4 + neighbors: + - neighbor: 203.0.113.10 + activate: yes + default_originate: true + - neighbor: 192.0.2.15 + activate: yes + graceful_restart: true + operation: merge + - name: remove bgp as 64496 from config + arista.eos.eos_bgp: + config: + bgp_as: 64496 + operation: delete + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['router bgp 64496', 'bgp router-id 192.0.2.1', 'bgp log-neighbor-changes', 'neighbor 203.0.113.5 remote-as 64511', 'neighbor 203.0.113.5 timers 300 360', 'neighbor 198.51.100.2 remote-as 64498', 'network 198.51.100.0 route-map RMAP_1', 'network 192.0.2.0 mask 255.255.254.0', 'address-family ipv4', 'redistribute isis route-map RMAP_1', 'exit-address-family']
+
+

+ + +Status +------ + + +- This module will be removed in a release after 2023-01-01. *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Nilashish Chakraborty (@NilashishC) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_cliconf.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_cliconf.rst new file mode 100644 index 000000000..c7ddd270d --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_cliconf.rst @@ -0,0 +1,100 @@ +.. _arista.eos.eos_cliconf: + + +************** +arista.eos.eos +************** + +**Use eos cliconf to run command on Arista EOS platform** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This eos plugin provides low level abstraction apis for sending and receiving CLI commands from Arista EOS network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsConfigurationComments
+
+ config_commands + +
+ list + / elements=string +
+
added in 2.0.0
+
+ Default:
[]
+
+
var: ansible_eos_config_commands
+
+
Specifies a list of commands that can make configuration changes to the target device.
+
When `ansible_network_single_user_mode` is enabled, if a command sent to the device is present in this list, the existing cache is invalidated.
+
+
+ eos_use_sessions + +
+ boolean +
+
+ Default:
"yes"
+
+
env:ANSIBLE_EOS_USE_SESSIONS
+
var: ansible_eos_use_sessions
+
+
Specifies if sessions should be used on remote host or not
+
+
+ + + + + + + + +Status +------ + + +Authors +~~~~~~~ + +- Ansible Networking Team (@ansible-network) + + +.. hint:: + Configuration entries for each entry type have a low to high priority order. For example, a variable that is lower in the list will override a variable that is higher up. diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_command_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_command_module.rst new file mode 100644 index 000000000..c9640062c --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_command_module.rst @@ -0,0 +1,427 @@ +.. _arista.eos.eos_command_module: + + +********************** +arista.eos.eos_command +********************** + +**Run arbitrary commands on an Arista EOS device** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Sends an arbitrary set of commands to an EOS node and returns the results read from the device. This module includes an argument that will cause the module to wait for a specific condition before returning or timing out if the condition is not met. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ commands + +
+ list + / elements=raw + / required +
+
+ +
The commands to send to the remote EOS device. The resulting output from the command is returned. If the wait_for argument is provided, the module is not returned until the condition is satisfied or the number of retries has been exceeded.
+
Commands may be represented either as simple strings or as dictionaries as described below. Refer to the Examples setion for some common uses.
+
+
+ answer + +
+ list + / elements=string +
+
+ +
The answer to reply with if prompt is matched. The value can be a single answer or a list of answer for multiple prompts. In case the command execution results in multiple prompts the sequence of the prompt and excepted answer should be in same order.
+
+
+ check_all + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
By default if any one of the prompts mentioned in prompt option is matched it won't check for other prompts. This boolean flag, that when set to True will check for all the prompts mentioned in prompt option in the given order. If the option is set to True all the prompts should be received from remote host if not it will result in timeout.
+
+
+ command + +
+ string + / required +
+
+ +
The command to send to the remote network device. The resulting output from the command is returned, unless sendonly is set.
+
+
+ newline + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
The boolean value, that when set to false will send answer to the device without a trailing newline.
+
+
+ output + +
+ string +
+
+
    Choices: +
  • text
  • +
  • json
  • +
+
+
How the remote device should format the command response data.
+
+
+ prompt + +
+ list + / elements=string +
+
+ +
A single regex pattern or a sequence of patterns to evaluate the expected prompt from command.
+
+
+ sendonly + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
The boolean value, that when set to true will send command to the device but not wait for a result.
+
+
+ version + +
+ string +
+
+
    Choices: +
  • 1
  • +
  • latest ←
  • +
+
+
Specifies the version of the JSON response returned when output=json.
+
+
+ interval + +
+ integer +
+
+ Default:
1
+
+
Configures the interval in seconds to wait between retries of the command. If the command does not pass the specified conditional, the interval indicates how to long to wait before trying the command again.
+
+
+ match + +
+ string +
+
+
    Choices: +
  • any
  • +
  • all ←
  • +
+
+
The match argument is used in conjunction with the wait_for argument to specify the match policy. Valid values are all or any. If the value is set to all then all conditionals in the wait_for must be satisfied. If the value is set to any then only one of the values must be satisfied.
+
+
+ retries + +
+ integer +
+
+ Default:
10
+
+
Specifies the number of retries a command should be tried before it is considered failed. The command is run on the target device every retry and evaluated against the wait_for conditionals.
+
+
+ wait_for + +
+ list + / elements=string +
+
+ +
Specifies what to evaluate from the output of the command and what conditionals to apply. This argument will cause the task to wait for a particular conditional to be true before moving forward. If the conditional is not true by the configured retries, the task fails. Note - With wait_for the value in result['stdout'] can be accessed using result, that is to access result['stdout'][0] use result[0] See examples.
+

aliases: waitfor
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: run show version on remote devices + arista.eos.eos_command: + commands: show version + + - name: run show version and check to see if output contains Arista + arista.eos.eos_command: + commands: show version + wait_for: result[0] contains Arista + + - name: run multiple commands on remote nodes + arista.eos.eos_command: + commands: + - show version + - show interfaces + + - name: run multiple commands and evaluate the output + arista.eos.eos_command: + commands: + - show version + - show interfaces + wait_for: + - result[0] contains Arista + - result[1] contains Loopback0 + + - name: run commands and specify the output format + arista.eos.eos_command: + commands: + - command: show version + output: json + + - name: check whether the switch is in maintenance mode + arista.eos.eos_command: + commands: show maintenance + wait_for: result[0] contains 'Under Maintenance' + + - name: check whether the switch is in maintenance mode using json output + arista.eos.eos_command: + commands: + - command: show maintenance + output: json + wait_for: result[0].units.System.state eq 'underMaintenance' + + - name: check whether the switch is in maintenance, with 8 retries + and 2 second interval between retries + arista.eos.eos_command: + commands: show maintenance + wait_for: result[0]['units']['System']['state'] eq 'underMaintenance' + interval: 2 + retries: 8 + + - name: run a command that requires a confirmation. Note that prompt + takes regexes, and so strings containing characters like brackets + need to be escaped. + arista.eos.eos_command: + commands: + - command: reload power + prompt: \[confirm\] + answer: y + newline: false + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ failed_conditions + +
+ list +
+
failed +
The list of conditionals that have failed
+
+
Sample:
+
['...', '...']
+
+
+ stdout + +
+ list +
+
always apart from low level errors (such as action plugin) +
The set of responses from the commands
+
+
Sample:
+
['...', '...']
+
+
+ stdout_lines + +
+ list +
+
always apart from low level errors (such as action plugin) +
The value of stdout split into a list
+
+
Sample:
+
[['...', '...'], ['...'], ['...']]
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_config_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_config_module.rst new file mode 100644 index 000000000..a0711557a --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_config_module.rst @@ -0,0 +1,546 @@ +.. _arista.eos.eos_config_module: + + +********************* +arista.eos.eos_config +********************* + +**Manage Arista EOS configuration sections** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Arista EOS configurations use a simple block indent file syntax for segmenting configuration into sections. This module provides an implementation for working with EOS configuration sections in a deterministic way. This module works with either CLI or eAPI transports. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ after + +
+ list + / elements=string +
+
+ +
The ordered set of commands to append to the end of the command stack if a change needs to be made. Just like with before this allows the playbook designer to append a set of commands to be executed after the command set.
+
+
+ backup + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
This argument will cause the module to create a full backup of the current running-config from the remote device before any changes are made. If the backup_options value is not given, the backup file is written to the backup folder in the playbook root directory or role root directory, if playbook is part of an ansible role. If the directory does not exist, it is created.
+
+
+ backup_options + +
+ dictionary +
+
+ +
This is a dict object containing configurable options related to backup file path. The value of this option is read only when backup is set to yes, if backup is set to no this option will be silently ignored.
+
+
+ dir_path + +
+ path +
+
+ +
This option provides the path ending with directory name in which the backup configuration file will be stored. If the directory does not exist it will be first created and the filename is either the value of filename or default filename as described in filename options description. If the path value is not given in that case a backup directory will be created in the current working directory and backup configuration will be copied in filename within backup directory.
+
+
+ filename + +
+ string +
+
+ +
The filename to be used to store the backup configuration. If the filename is not given it will be generated based on the hostname, current time and date in format defined by <hostname>_config.<current-date>@<current-time>
+
+
+ before + +
+ list + / elements=string +
+
+ +
The ordered set of commands to push on to the command stack if a change needs to be made. This allows the playbook designer the opportunity to perform configuration commands prior to pushing any changes without affecting how the set of commands are matched against the system.
+
+
+ defaults + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
The defaults argument will influence how the running-config is collected from the device. When the value is set to true, the command used to collect the running-config is append with the all keyword. When the value is set to false, the command is issued without the all keyword
+
+
+ diff_against + +
+ string +
+
+
    Choices: +
  • startup
  • +
  • running
  • +
  • intended
  • +
  • session ←
  • +
  • validate_config
  • +
+
+
When using the ansible-playbook --diff command line argument the module can generate diffs against different sources.
+
When this option is configure as startup, the module will return the diff of the running-config against the startup-config.
+
When this option is configured as intended, the module will return the diff of the running-config against the configuration provided in the intended_config argument.
+
When this option is configured as running, the module will return the before and after diff of the running-config with respect to any changes made to the device configuration.
+
When this option is configured as session, the diff returned will be based on the configuration session.
+
When this option is configured as validate_config, the module will return before with the running-config before applying the intended config and after with the session config after applying the intended config to the session.
+
+
+ diff_ignore_lines + +
+ list + / elements=string +
+
+ +
Use this argument to specify one or more lines that should be ignored during the diff. This is used for lines in the configuration that are automatically updated by the system. This argument takes a list of regular expressions or exact line matches.
+
+
+ intended_config + +
+ string +
+
+ +
The intended_config provides the master configuration that the node should conform to and is used to check the final running-config against. This argument will not modify any settings on the remote device and is strictly used to check the compliance of the current device's configuration against. When specifying this argument, the task should also modify the diff_against value and set it to intended. The configuration lines for this value should be similar to how it will appear if present in the running-configuration of the device including the indentation to ensure correct diff.
+
+
+ lines + +
+ list + / elements=string +
+
+ +
The ordered set of commands that should be configured in the section. The commands must be the exact same commands as found in the device running-config as found in the device running-config to ensure idempotency and correct diff. Be sure to note the configuration command syntax as some commands are automatically modified by the device config parser.
+

aliases: commands
+
+
+ match + +
+ string +
+
+
    Choices: +
  • line ←
  • +
  • strict
  • +
  • exact
  • +
  • none
  • +
+
+
Instructs the module on the way to perform the matching of the set of commands against the current device config. If match is set to line, commands are matched line by line. If match is set to strict, command lines are matched with respect to position. If match is set to exact, command lines must be an equal match. Finally, if match is set to none, the module will not attempt to compare the source configuration with the running configuration on the remote device.
+
+
+ parents + +
+ list + / elements=string +
+
+ +
The ordered set of parents that uniquely identify the section or hierarchy the commands should be checked against. If the parents argument is omitted, the commands are checked against the set of top level or global commands.
+
+
+ replace + +
+ string +
+
+
    Choices: +
  • line ←
  • +
  • block
  • +
  • config
  • +
+
+
Instructs the module on the way to perform the configuration on the device. If the replace argument is set to line then the modified lines are pushed to the device in configuration mode. If the replace argument is set to block then the entire command block is pushed to the device in configuration mode if any line is not correct.
+
+
+ running_config + +
+ string +
+
+ +
The module, by default, will connect to the remote device and retrieve the current running-config to use as a base for comparing against the contents of source. There are times when it is not desirable to have the task get the current running-config for every task in a playbook. The running_config argument allows the implementer to pass in the configuration to use as the base config for this module. The configuration lines for this option should be similar to how it will appear if present in the running-configuration of the device including the indentation to ensure idempotency and correct diff.
+

aliases: config
+
+
+ save_when + +
+ string +
+
+
    Choices: +
  • always
  • +
  • never ←
  • +
  • modified
  • +
  • changed
  • +
+
+
When changes are made to the device running-configuration, the changes are not copied to non-volatile storage by default. Using this argument will change that before. If the argument is set to always, then the running-config will always be copied to the startup-config and the modified flag will always be set to True. If the argument is set to modified, then the running-config will only be copied to the startup-config if it has changed since the last save to startup-config. If the argument is set to never, the running-config will never be copied to the startup-config. If the argument is set to changed, then the running-config will only be copied to the startup-config if the task has made a change. changed was added in Ansible 2.5.
+
+
+ src + +
+ path +
+
+ +
The src argument provides a path to the configuration file to load into the remote system. The path can either be a full system path to the configuration file if the value starts with / or relative to the root of the implemented role or playbook. This argument is mutually exclusive with the lines and parents arguments. It can be a Jinja2 template as well. The configuration lines in the source file should be similar to how it will appear if present in the running-configuration (live switch config) of the device i ncluding the indentation to ensure idempotency and correct diff. Arista EOS device config has 3 spaces indentation.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - Abbreviated commands are NOT idempotent, see `Network FAQ <../network/user_guide/faq.html#why-do-the-config-modules-always-return-changed-true-with-abbreviated-commands>`_. + - To ensure idempotency and correct diff the configuration lines in the relevant module options should be similar to how they appear if present in the running configuration on device including the indentation. + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure top level settings + arista.eos.eos_config: + lines: hostname {{ inventory_hostname }} + + - name: load an acl into the device + arista.eos.eos_config: + lines: + - 10 permit ip host 192.0.2.1 any log + - 20 permit ip host 192.0.2.2 any log + - 30 permit ip host 192.0.2.3 any log + - 40 permit ip host 192.0.2.4 any log + parents: ip access-list test + before: no ip access-list test + replace: block + + - name: load configuration from file + arista.eos.eos_config: + src: eos.cfg + + - name: render a Jinja2 template onto an Arista switch + arista.eos.eos_config: + backup: yes + src: eos_template.j2 + + - name: diff the running config against a master config + arista.eos.eos_config: + diff_against: intended + intended_config: "{{ lookup('file', 'master.cfg') }}" + + - name: for idempotency, use full-form commands + arista.eos.eos_config: + lines: + # - shut + - shutdown + # parents: int eth1 + parents: interface Ethernet1 + + - name: configurable backup path + arista.eos.eos_config: + src: eos_template.j2 + backup: yes + backup_options: + filename: backup.cfg + dir_path: /home/user + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ backup_path + +
+ string +
+
when backup is yes +
The full path to the backup file
+
+
Sample:
+
/playbooks/ansible/backup/eos_config.2016-07-16@22:28:34
+
+
+ commands + +
+ list +
+
always +
The set of commands that will be pushed to the remote device
+
+
Sample:
+
['hostname switch01', 'interface Ethernet1', 'no shutdown']
+
+
+ date + +
+ string +
+
when backup is yes +
The date extracted from the backup file name
+
+
Sample:
+
2016-07-16
+
+
+ filename + +
+ string +
+
when backup is yes and filename is not specified in backup options +
The name of the backup file
+
+
Sample:
+
eos_config.2016-07-16@22:28:34
+
+
+ shortname + +
+ string +
+
when backup is yes and filename is not specified in backup options +
The full path to the backup file excluding the timestamp
+
+
Sample:
+
/playbooks/ansible/backup/eos_config
+
+
+ time + +
+ string +
+
when backup is yes +
The time extracted from the backup file name
+
+
Sample:
+
22:28:34
+
+
+ updates + +
+ list +
+
always +
The set of commands that will be pushed to the remote device
+
+
Sample:
+
['hostname switch01', 'interface Ethernet1', 'no shutdown']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_eapi_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_eapi_module.rst new file mode 100644 index 000000000..5d6b54b3d --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_eapi_module.rst @@ -0,0 +1,341 @@ +.. _arista.eos.eos_eapi_module: + + +******************* +arista.eos.eos_eapi +******************* + +**Manage and configure Arista EOS eAPI.** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Use to enable or disable eAPI access, and set the port and state of http, https, local_http and unix-socket servers. +- When enabling eAPI access the default is to enable HTTP on port 80, enable HTTPS on port 443, disable local HTTP, and disable Unix socket server. Use the options listed below to override the default configuration. +- Requires EOS v4.12 or greater. + + + +Requirements +------------ +The below requirements are needed on the host that executes this module. + +- EOS v4.12 or greater + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ string +
+
+ +
The module, by default, will connect to the remote device and retrieve the current running-config to use as a base for comparing against the contents of source. There are times when it is not desirable to have the task get the current running-config for every task in a playbook. The config argument allows the implementer to pass in the configuration to use as the base config for comparison.
+
+
+ http + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
The http argument controls the operating state of the HTTP transport protocol when eAPI is present in the running-config. When the value is set to True, the HTTP protocol is enabled and when the value is set to False, the HTTP protocol is disabled. By default, when eAPI is first configured, the HTTP protocol is disabled.
+

aliases: enable_http
+
+
+ http_port + +
+ integer +
+
+ +
Configures the HTTP port that will listen for connections when the HTTP transport protocol is enabled. This argument accepts integer values in the valid range of 1 to 65535.
+
+
+ https + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
The https argument controls the operating state of the HTTPS transport protocol when eAPI is present in the running-config. When the value is set to True, the HTTPS protocol is enabled and when the value is set to False, the HTTPS protocol is disabled. By default, when eAPI is first configured, the HTTPS protocol is enabled.
+

aliases: enable_https
+
+
+ https_port + +
+ integer +
+
+ +
Configures the HTTP port that will listen for connections when the HTTP transport protocol is enabled. This argument accepts integer values in the valid range of 1 to 65535.
+
+
+ local_http + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
The local_http argument controls the operating state of the local HTTP transport protocol when eAPI is present in the running-config. When the value is set to True, the HTTP protocol is enabled and restricted to connections from localhost only. When the value is set to False, the HTTP local protocol is disabled.
+
Note is value is independent of the http argument
+

aliases: enable_local_http
+
+
+ local_http_port + +
+ integer +
+
+ +
Configures the HTTP port that will listen for connections when the HTTP transport protocol is enabled. This argument accepts integer values in the valid range of 1 to 65535.
+
+
+ socket + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
The socket argument controls the operating state of the UNIX Domain Socket used to receive eAPI requests. When the value of this argument is set to True, the UDS will listen for eAPI requests. When the value is set to False, the UDS will not be available to handle requests. By default when eAPI is first configured, the UDS is disabled.
+

aliases: enable_socket
+
+
+ state + +
+ string +
+
+
    Choices: +
  • started ←
  • +
  • stopped
  • +
+
+
The state argument controls the operational state of eAPI on the remote device. When this argument is set to started, eAPI is enabled to receive requests and when this argument is stopped, eAPI is disabled and will not receive requests.
+
+
+ timeout + +
+ integer +
+
+ Default:
30
+
+
The time (in seconds) to wait for the eAPI configuration to be reflected in the running-config.
+
+
+ vrf + +
+ string +
+
+ Default:
"default"
+
+
The vrf argument will configure eAPI to listen for connections in the specified VRF. By default, eAPI transports will listen for connections in the global table. This value requires the VRF to already be created otherwise the task will fail.
+
+
+ + + + +Examples +-------- + +.. code-block:: yaml + + - name: Enable eAPI access with default configuration + arista.eos.eos_eapi: + state: started + + - name: Enable eAPI with no HTTP, HTTPS at port 9443, local HTTP at port 80, and socket + enabled + arista.eos.eos_eapi: + state: started + http: false + https_port: 9443 + local_http: yes + local_http_port: 80 + socket: yes + + - name: Shutdown eAPI access + arista.eos.eos_eapi: + state: stopped + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['management api http-commands', 'protocol http port 81', 'no protocol https']
+
+
+ session_name + +
+ string +
+
when changed is True +
The EOS config session name used to load the configuration
+
+
Sample:
+
ansible_1479315771
+
+
+ urls + +
+ dictionary +
+
when eAPI is started +
Hash of URL endpoints eAPI is listening on per interface
+
+
Sample:
+
{'Management1': ['http://172.26.10.1:80']}
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_facts_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_facts_module.rst new file mode 100644 index 000000000..ad9a7fa34 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_facts_module.rst @@ -0,0 +1,427 @@ +.. _arista.eos.eos_facts_module: + + +******************** +arista.eos.eos_facts +******************** + +**Collect facts from remote devices running Arista EOS** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- Collects facts from Arista devices running the EOS operating system. This module places the facts gathered in the fact tree keyed by the respective resource name. The facts module will always collect a base set of facts from the device and can enable or disable collection of additional facts. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ available_network_resources + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
When 'True' a list of network resources for which resource modules are available will be provided.
+
+
+ gather_network_resources + +
+ list + / elements=string +
+
+ +
When supplied, this argument will restrict the facts collected to a given subset. Possible values for this argument include all and the resources like interfaces, vlans etc. Can specify a list of values to include a larger subset. Values can also be used with an initial ! to specify that a specific subset should not be collected. Values can also be used with an initial ! to specify that a specific subset should not be collected. Valid subsets are 'all', 'interfaces', 'l2_interfaces', 'l3_interfaces', 'lacp', 'lacp_interfaces', 'lag_interfaces', 'lldp_global', 'lldp_interfaces', 'vlans', 'acls'.
+
+
+ gather_subset + +
+ list + / elements=string +
+
+ Default:
"min"
+
+
When supplied, this argument will restrict the facts collected to a given subset. Possible values for this argument include all, hardware, config, legacy, interfaces, and min. Can specify a list of values to include a larger subset. Values can also be used with an initial ! to specify that a specific subset should not be collected.
+
+
+ + + + +Examples +-------- + +.. code-block:: yaml + + - name: Gather all legacy facts + - arista.eos.eos_facts: + gather_subset: all + + - name: Gather only the config and default facts + arista.eos.eos_facts: + gather_subset: + - config + + - name: Do not gather hardware facts + arista.eos.eos_facts: + gather_subset: + - '!hardware' + + - name: Gather legacy and resource facts + arista.eos.eos_facts: + gather_subset: all + gather_network_resources: all + + - name: Gather only the interfaces resource facts and no legacy facts + - arista.eos.eos_facts: + gather_subset: + - '!all' + - '!min' + gather_network_resources: + - interfaces + + - name: Gather all resource facts and minimal legacy facts + arista.eos.eos_facts: + gather_subset: min + gather_network_resources: all + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ ansible_net_all_ipv4_addresses + +
+ list +
+
when interfaces is configured +
All IPv4 addresses configured on the device
+
+
+
+ ansible_net_all_ipv6_addresses + +
+ list +
+
when interfaces is configured +
All IPv6 addresses configured on the device
+
+
+
+ ansible_net_api + +
+ string +
+
always +
The name of the transport
+
+
+
+ ansible_net_config + +
+ string +
+
when config is configured +
The current active config from the device
+
+
+
+ ansible_net_filesystems + +
+ list +
+
when hardware is configured +
All file system names available on the device
+
+
+
+ ansible_net_fqdn + +
+ string +
+
always +
The fully qualified domain name of the device
+
+
+
+ ansible_net_gather_network_resources + +
+ list +
+
when the resource is configured +
The list of fact for network resource subsets collected from the device
+
+
+
+ ansible_net_gather_subset + +
+ list +
+
always +
The list of fact subsets collected from the device
+
+
+
+ ansible_net_hostname + +
+ string +
+
always +
The configured hostname of the device
+
+
+
+ ansible_net_image + +
+ string +
+
always +
The image file the device is running
+
+
+
+ ansible_net_interfaces + +
+ dictionary +
+
when interfaces is configured +
A hash of all interfaces running on the system
+
+
+
+ ansible_net_memfree_mb + +
+ integer +
+
when hardware is configured +
The available free memory on the remote device in Mb
+
+
+
+ ansible_net_memtotal_mb + +
+ integer +
+
when hardware is configured +
The total memory on the remote device in Mb
+
+
+
+ ansible_net_model + +
+ string +
+
always +
The model name returned from the device
+
+
+
+ ansible_net_neighbors + +
+ dictionary +
+
when interfaces is configured +
The list of LLDP neighbors from the remote device
+
+
+
+ ansible_net_python_version + +
+ string +
+
always +
The Python version Ansible controller is using
+
+
+
+ ansible_net_serialnum + +
+ string +
+
always +
The serial number of the remote device
+
+
+
+ ansible_net_version + +
+ string +
+
always +
The operating system version running on the remote device
+
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) +- Nathaniel Case (@Qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_hostname_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_hostname_module.rst new file mode 100644 index 000000000..382a59f6d --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_hostname_module.rst @@ -0,0 +1,392 @@ +.. _arista.eos.eos_hostname_module: + + +*********************** +arista.eos.eos_hostname +*********************** + +**Manages hostname resource module** + + +Version added: 4.1.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attribute of hostname on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A dictionary of hostname options
+
+
+ hostname + +
+ string +
+
+ +
The system's hostname
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section hostname.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
The states rendered, gathered and parsed does not perform any change on the device.
+
The state rendered will transform the configuration in config option to platform specific CLI commands which will be returned in the rendered key within the result. For state rendered active connection to remote host is not required.
+
The states merged, replaced and overridden have identical behaviour for this module.
+
The state gathered will fetch the running configuration from device and transform it into structured data in the format as per the resource module argspec and the value is returned in the gathered key within the result.
+
The state parsed reads the configuration from running_config option and transforms it into JSON format as per the resource module parameters and the value is returned in the parsed key within the result. The value of running_config option should be the same format as the output of command show running-config | section ^hostname executed on device. For state parsed active connection to remote host is not required.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.60M + - This module works with connection ``network_cli``. See the `EOS Platform Options `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using state: merged + # Before state: + # ------------- + # test#show running-config | section ^hostname + # hostname eos + # Merged play: + # ------------ + - name: Apply the provided configuration + arista.eos.eos_hostname: + config: + hostname: eos + state: merged + # Commands Fired: + # --------------- + # "commands": [ + # "hostname eos", + # ], + # After state: + # ------------ + # test#show running-config | section ^hostname + # hostname eos + + + # Using state: deleted + # Before state: + # ------------- + # test#show running-config | section ^hostname + # hostname eosTest + # Deleted play: + # ------------- + - name: Remove all existing configuration + arista.eos.eos_hostname: + state: deleted + # Commands Fired: + # --------------- + # "commands": [ + # "no hostname eosTest", + # ], + # After state: + # ------------ + # test#show running-config | section ^hostname + # hostname eos + + + # Using state: overridden + # Before state: + # ------------- + # test#show running-config | section ^hostname + # hostname eos + # Overridden play: + # ---------------- + - name: Override commands with provided configuration + arista.eos.eos_hostname: + config: + hostname: eosTest + state: overridden + # Commands Fired: + # --------------- + # "commands": [ + # "hostname eosTest", + # ], + # After state: + # ------------ + # test#show running-config | section ^hostname + # hostname eosTest + + + # Using state: replaced + # Before state: + # ------------- + # test#show running-config | section ^hostname + # hostname eosTest + # Replaced play: + # -------------- + - name: Replace commands with provided configuration + arista.eos.eos_hostname: + config: + hostname: eosTest + state: replaced + # Commands Fired: + # --------------- + # "commands": [], + # After state: + # ------------ + # test#show running-config | section ^hostname + # hostname eosTest + + # Using state: gathered + # Before state: + # ------------- + #test#show running-config | section ^hostname + # hostname eosTest + # Gathered play: + # -------------- + - name: Gather listed hostname config + arista.eos.eos_hostname: + state: gathered + # Module Execution Result: + # ------------------------ + # "gathered": { + # "hostname": "eosTest" + # }, + + # Using state: rendered + # Rendered play: + # -------------- + - name: Render the commands for provided configuration + arista.eos.eos_hostname: + config: + hostname: eosTest + state: rendered + # Module Execution Result: + # ------------------------ + # "rendered": [ + # "hostname eosTest", + # ] + + # Using state: parsed + # File: parsed.cfg + # ---------------- + # hostname eosTest + # Parsed play: + # ------------ + - name: Parse the provided configuration with the existing running configuration + arista.eos.eos_hostname: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + # Module Execution Result: + # ------------------------ + # "parsed": { + # "hostname": "eosTest" + # } + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ dictionary +
+
when changed +
The resulting configuration after module execution.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ before + +
+ dictionary +
+
when state is merged, replaced, overridden, deleted or purged +
The configuration prior to the module execution.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ commands + +
+ list +
+
when state is merged, replaced, overridden, deleted or purged +
The set of commands pushed to the remote device.
+
+
Sample:
+
['hostname eost_test']
+
+
+ gathered + +
+ list +
+
when state is gathered +
Facts about the network resource gathered from the remote device as structured data.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ parsed + +
+ list +
+
when state is parsed +
The device native config provided in running_config option parsed into structured data as per module argspec.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ rendered + +
+ list +
+
when state is rendered +
The provided configuration in the task rendered in device-native format (offline).
+
+
Sample:
+
['hostname eost_test']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_httpapi.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_httpapi.rst new file mode 100644 index 000000000..4c92703a6 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_httpapi.rst @@ -0,0 +1,81 @@ +.. _arista.eos.eos_httpapi: + + +************** +arista.eos.eos +************** + +**Use eAPI to run command on eos platform** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This eos plugin provides low level abstraction api's for sending and receiving CLI commands with eos network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + +
ParameterChoices/DefaultsConfigurationComments
+
+ eos_use_sessions + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
env:ANSIBLE_EOS_USE_SESSIONS
+
var: ansible_eos_use_sessions
+
+
Specifies if sessions should be used on remote host or not
+
+
+ + + + + + + + +Status +------ + + +Authors +~~~~~~~ + +- Ansible Networking Team (@ansible-network) + + +.. hint:: + Configuration entries for each entry type have a low to high priority order. For example, a variable that is lower in the list will override a variable that is higher up. diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_interfaces_module.rst new file mode 100644 index 000000000..cebb499c4 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_interfaces_module.rst @@ -0,0 +1,551 @@ +.. _arista.eos.eos_interfaces_module: + + +************************* +arista.eos.eos_interfaces +************************* + +**Interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages the interface attributes of Arista EOS interfaces. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
The provided configuration
+
+
+ description + +
+ string +
+
+ +
Interface description
+
+
+ duplex + +
+ string +
+
+ +
Interface link status. Applicable for Ethernet interfaces only.
+
Values other than auto must also set speed.
+
Ignored when speed is set above 1000.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes ←
  • +
+
+
Administrative state of the interface.
+
Set the value to true to administratively enable the interface or false to disable it.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • layer2
  • +
  • layer3
  • +
+
+
Manage Layer2 or Layer3 state of the interface. Applicable for Ethernet and port channel interfaces only.
+
+
+ mtu + +
+ integer +
+
+ +
MTU for a specific interface. Must be an even number between 576 and 9216. Applicable for Ethernet interfaces only.
+
+
+ name + +
+ string + / required +
+
+ +
Full name of the interface, e.g. GigabitEthernet1.
+
+
+ speed + +
+ string +
+
+ +
Interface link speed. Applicable for Ethernet interfaces only.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ^interface.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • parsed
  • +
  • rendered
  • +
  • gathered
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # description "Interface 1" + # ! + # interface Ethernet2 + # ! + # interface Management1 + # description "Management interface" + # ip address dhcp + # ! + + - name: Merge provided configuration with device configuration + arista.eos.eos_interfaces: + config: + - name: Ethernet1 + enabled: true + mode: layer3 + - name: Ethernet2 + description: Configured by Ansible + enabled: false + state: merged + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # description "Interface 1" + # no switchport + # ! + # interface Ethernet2 + # description "Configured by Ansible" + # shutdown + # ! + # interface Management1 + # description "Management interface" + # ip address dhcp + # ! + + # Using replaced + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # description "Interface 1" + # ! + # interface Ethernet2 + # ! + # interface Management1 + # description "Management interface" + # ip address dhcp + # ! + + - name: Replaces device configuration of listed interfaces with provided configuration + arista.eos.eos_interfaces: + config: + - name: Ethernet1 + enabled: true + - name: Ethernet2 + description: Configured by Ansible + enabled: false + state: replaced + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ! + # interface Ethernet2 + # description "Configured by Ansible" + # shutdown + # ! + # interface Management1 + # description "Management interface" + # ip address dhcp + # ! + + # Using overridden + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # description "Interface 1" + # ! + # interface Ethernet2 + # ! + # interface Management1 + # description "Management interface" + # ip address dhcp + # ! + + - name: Overrides all device configuration with provided configuration + arista.eos.eos_interfaces: + config: + - name: Ethernet1 + enabled: true + - name: Ethernet2 + description: Configured by Ansible + enabled: false + state: overridden + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ! + # interface Ethernet2 + # description "Configured by Ansible" + # shutdown + # ! + # interface Management1 + # ip address dhcp + # ! + + # Using deleted + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # description "Interface 1" + # no switchport + # ! + # interface Ethernet2 + # ! + # interface Management1 + # description "Management interface" + # ip address dhcp + # ! + + - name: Delete or return interface parameters to default settings + arista.eos.eos_interfaces: + config: + - name: Ethernet1 + state: deleted + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ! + # interface Ethernet2 + # ! + # interface Management1 + # description "Management interface" + # ip address dhcp + # ! + + # Using rendered + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_interfaces: + config: + - name: Ethernet1 + enabled: true + mode: layer3 + - name: Ethernet2 + description: Configured by Ansible + enabled: false + state: merged + + # Output: + # ------------ + + # - "interface Ethernet1" + # - "description "Interface 1"" + # - "no swithcport" + # - "interface Ethernet2" + # - "description "Configured by Ansible"" + # - "shutdown" + # - "interface Management1" + # - "description "Management interface"" + # - "ip address dhcp" + + # Using parsed + # parsed.cfg + + # interface Ethernet1 + # description "Interface 1" + # ! + # interface Ethernet2 + # description "Configured by Ansible" + # shutdown + # ! + + - name: Use parsed to convert native configs to structured data + arista.eos.interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Output + # parsed: + # - name: Ethernet1 + # enabled: True + # mode: layer2 + # - name: Ethernet2 + # description: 'Configured by Ansible' + # enabled: False + # mode: layer2 + + # Using gathered: + + # Existing config on the device + # ----------------------------- + # interface Ethernet1 + # description "Interface 1" + # ! + # interface Ethernet2 + # description "Configured by Ansible" + # shutdown + # ! + + - name: Gather interfaces facts from the device + arista.eos.interfaces: + state: gathered + + # output + # gathered: + # - name: Ethernet1 + # enabled: True + # mode: layer2 + # - name: Ethernet2 + # description: 'Configured by Ansible' + # enabled: False + # mode: layer2 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ dictionary +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format of the parameters above.
+
+
+ before + +
+ dictionary +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['interface Ethernet2', 'shutdown', 'speed 10full']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_l2_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_l2_interfaces_module.rst new file mode 100644 index 000000000..b487ae2b3 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_l2_interfaces_module.rst @@ -0,0 +1,567 @@ +.. _arista.eos.eos_l2_interfaces_module: + + +**************************** +arista.eos.eos_l2_interfaces +**************************** + +**L2 interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of Layer-2 interface on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of Layer-2 interface options
+
+
+ access + +
+ dictionary +
+
+ +
Switchport mode access command to configure the interface as a layer 2 access.
+
+
+ vlan + +
+ integer +
+
+ +
Configure given VLAN in access port. It's used as the access VLAN ID.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • access
  • +
  • trunk
  • +
+
+
Mode in which interface needs to be configured.
+
Access mode is not shown in interface facts, so idempotency will not be maintained for switchport mode access and every time the output will come as changed=True.
+
+
+ name + +
+ string + / required +
+
+ +
Full name of interface, e.g. Ethernet1.
+
+
+ trunk + +
+ dictionary +
+
+ +
Switchport mode trunk command to configure the interface as a Layer 2 trunk.
+
+
+ native_vlan + +
+ integer +
+
+ +
Native VLAN to be configured in trunk port. It is used as the trunk native VLAN ID.
+
+
+ trunk_allowed_vlans + +
+ list + / elements=string +
+
+ +
List of allowed VLANs in a given trunk port. These are the only VLANs that will be configured on the trunk.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ^interface.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • parsed
  • +
  • rendered
  • +
  • gathered
  • +
+
+
The state of the configuration after module completion
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # switchport access vlan 20 + # ! + # interface Ethernet2 + # switchport trunk native vlan 20 + # switchport mode trunk + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + # ! + + - name: Merge provided configuration with device configuration. + arista.eos.eos_l2_interfaces: + config: + - name: Ethernet1 + mode: trunk + trunk: + native_vlan: 10 + - name: Ethernet2 + mode: access + access: + vlan: 30 + state: merged + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # switchport trunk native vlan 10 + # switchport mode trunk + # ! + # interface Ethernet2 + # switchport access vlan 30 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + # ! + + # Using replaced + + # Before state: + # ------------- + # + # veos2#show running-config | s int + # interface Ethernet1 + # switchport access vlan 20 + # ! + # interface Ethernet2 + # switchport trunk native vlan 20 + # switchport mode trunk + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + # ! + + - name: Replace device configuration of specified L2 interfaces with provided configuration. + arista.eos.eos_l2_interfaces: + config: + - name: Ethernet1 + mode: trunk + trunk: + native_vlan: 20 + trunk_allowed_vlans: 5-10, 15 + state: replaced + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # switchport trunk native vlan 20 + # switchport trunk allowed vlan 5-10,15 + # switchport mode trunk + # ! + # interface Ethernet2 + # switchport trunk native vlan 20 + # switchport mode trunk + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + # ! + + # Using overridden + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # switchport access vlan 20 + # ! + # interface Ethernet2 + # switchport trunk native vlan 20 + # switchport mode trunk + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + # ! + + - name: Override device configuration of all L2 interfaces on device with provided + configuration. + arista.eos.eos_l2_interfaces: + config: + - name: Ethernet2 + mode: access + access: + vlan: 30 + state: overridden + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ! + # interface Ethernet2 + # switchport access vlan 30 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + # ! + + # Using deleted + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # switchport access vlan 20 + # ! + # interface Ethernet2 + # switchport trunk native vlan 20 + # switchport mode trunk + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + # ! + + - name: Delete EOS L2 interfaces as in given arguments. + arista.eos.eos_l2_interfaces: + config: + - name: Ethernet1 + - name: Ethernet2 + state: deleted + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ! + # interface Ethernet2 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + # using rendered + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_l2_interfaces: + config: + - name: Ethernet1 + mode: trunk + trunk: + native_vlan: 10 + - name: Ethernet2 + mode: access + access: + vlan: 30 + state: merged + + # Output : + # ------------ + # + # - "interface Ethernet1" + # - "switchport trunk native vlan 10" + # - "switchport mode trunk" + # - "interface Ethernet2" + # - "switchport access vlan 30" + # - "interface Management1" + # - "ip address dhcp" + # - "ipv6 address auto-config" + + + # using parsed + + # parsed.cfg + + # interface Ethernet1 + # switchport trunk native vlan 10 + # switchport mode trunk + # ! + # interface Ethernet2 + # switchport access vlan 30 + # ! + + - name: Use parsed to convert native configs to structured data + arista.eos.l2_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Output: + # parsed: + # - name: Ethernet1 + # mode: trunk + # trunk: + # native_vlan: 10 + # - name: Ethernet2 + # mode: access + # access: + # vlan: 30 + + + # Using gathered: + # Existing config on the device: + # + # veos#show running-config | section interface + # interface Ethernet1 + # switchport trunk native vlan 10 + # switchport mode trunk + # ! + # interface Ethernet2 + # switchport access vlan 30 + # ! + + - name: Gather interfaces facts from the device + arista.eos.l2_interfaces: + state: gathered + # output: + # gathered: + # - name: Ethernet1 + # mode: trunk + # trunk: + # native_vlan: 10 + # - name: Ethernet2 + # mode: access + # access: + # vlan: 30 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['interface Ethernet2', 'switchport access vlan 20']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_l3_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_l3_interfaces_module.rst new file mode 100644 index 000000000..c6615fc0d --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_l3_interfaces_module.rst @@ -0,0 +1,551 @@ +.. _arista.eos.eos_l3_interfaces_module: + + +**************************** +arista.eos.eos_l3_interfaces +**************************** + +**L3 interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of Layer 3 interfaces on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of Layer 3 interface options
+
+
+ ipv4 + +
+ list + / elements=dictionary +
+
+ +
List of IPv4 addresses to be set for the Layer 3 interface mentioned in name option.
+
+
+ address + +
+ string +
+
+ +
IPv4 address to be set in the format <ipv4 address>/<mask> eg. 192.0.2.1/24, or dhcp to query DHCP for an IP address.
+
+
+ secondary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Whether or not this address is a secondary address.
+
+
+ virtual + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Whether or not this address is a virtual address.
+
+
+ ipv6 + +
+ list + / elements=dictionary +
+
+ +
List of IPv6 addresses to be set for the Layer 3 interface mentioned in name option.
+
+
+ address + +
+ string +
+
+ +
IPv6 address to be set in the address format is <ipv6 address>/<mask> eg. 2001:db8:2201:1::1/64 or auto-config to use SLAAC to chose an address.
+
+
+ name + +
+ string + / required +
+
+ +
Full name of the interface, i.e. Ethernet1.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ^interface.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • parsed
  • +
  • gathered
  • +
  • rendered
  • +
+
+
The state of the configuration after module completion
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. 'eos_l2_interfaces/eos_interfaces' should be used for preparing the interfaces , before applying L3 configurations using this module (eos_l3_interfaces). + + + +Examples +-------- + +.. code-block:: yaml + + # Using deleted + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 192.0.2.12/24 + # ! + # interface Ethernet2 + # ipv6 address 2001:db8::1/64 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + - name: Delete L3 attributes of given interfaces. + arista.eos.eos_l3_interfaces: + config: + - name: Ethernet1 + - name: Ethernet2 + state: deleted + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ! + # interface Ethernet2 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + + # Using merged + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 192.0.2.12/24 + # ! + # interface Ethernet2 + # ipv6 address 2001:db8::1/64 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + - name: Merge provided configuration with device configuration. + arista.eos.eos_l3_interfaces: + config: + - name: Ethernet1 + ipv4: + - address: 198.51.100.14/24 + - name: Ethernet2 + ipv4: + - address: 203.0.113.27/24 + state: merged + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 198.51.100.14/24 + # ! + # interface Ethernet2 + # ip address 203.0.113.27/24 + # ipv6 address 2001:db8::1/64 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + + # Using overridden + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 192.0.2.12/24 + # ! + # interface Ethernet2 + # ipv6 address 2001:db8::1/64 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + - name: Override device configuration of all L2 interfaces on device with provided + configuration. + arista.eos.eos_l3_interfaces: + config: + - name: Ethernet1 + ipv6: + - address: 2001:db8:feed::1/96 + - name: Management1 + ipv4: + - address: dhcp + ipv6: auto-config + state: overridden + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ipv6 address 2001:db8:feed::1/96 + # ! + # interface Ethernet2 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + + # Using replaced + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 192.0.2.12/24 + # ! + # interface Ethernet2 + # ipv6 address 2001:db8::1/64 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + - name: Replace device configuration of specified L2 interfaces with provided configuration. + arista.eos.eos_l3_interfaces: + config: + - name: Ethernet2 + ipv4: + - address: 203.0.113.27/24 + state: replaced + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 192.0.2.12/24 + # ! + # interface Ethernet2 + # ip address 203.0.113.27/24 + # ! + # interface Management1 + # ip address dhcp + # ipv6 address auto-config + + # Using parsed: + + # parsed.cfg + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 198.51.100.14/24 + # ! + # interface Ethernet2 + # ip address 203.0.113.27/24 + # ! + + - name: Use parsed to convert native configs to structured data + arista.eos.interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Output: + + # parsed: + # - name: Ethernet1 + # ipv4: + # - address: 198.51.100.14/24 + # - name: Ethernet2 + # ipv4: + # - address: 203.0.113.27/24 + + # Using rendered: + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_l3_interfaces: + config: + - name: Ethernet1 + ipv4: + - address: 198.51.100.14/24 + - name: Ethernet2 + ipv4: + - address: 203.0.113.27/24 + state: rendered + + # Output + # ------------ + #rendered: + # - "interface Ethernet1" + # - "ip address 198.51.100.14/24" + # - "interface Ethernet2" + # - "ip address 203.0.113.27/24" + + # using gathered: + + # Native COnfig: + # veos#show running-config | section interface + # interface Ethernet1 + # ip address 198.51.100.14/24 + # ! + # interface Ethernet2 + # ip address 203.0.113.27/24 + # ! + + - name: Gather l3 interfaces facts from the device + arista.eos.l3_interfaces: + state: gathered + + # gathered: + # - name: Ethernet1 + # ipv4: + # - address: 198.51.100.14/24 + # - name: Ethernet2 + # ipv4: + # - address: 203.0.113.27/24 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['interface Ethernet2', 'ip address 192.0.2.12/24']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_lacp_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_lacp_interfaces_module.rst new file mode 100644 index 000000000..dbe2ffa98 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_lacp_interfaces_module.rst @@ -0,0 +1,427 @@ +.. _arista.eos.eos_lacp_interfaces_module: + + +****************************** +arista.eos.eos_lacp_interfaces +****************************** + +**LACP interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages Link Aggregation Control Protocol (LACP) attributes of interfaces on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of LACP interfaces options.
+
+
+ name + +
+ string +
+
+ +
Full name of the interface (i.e. Ethernet1).
+
+
+ port_priority + +
+ integer +
+
+ +
LACP port priority for the interface. Range 1-65535.
+
+
+ timer + +
+ string +
+
+
    Choices: +
  • fast
  • +
  • normal
  • +
+
+
Rate at which PDUs are sent by LACP. At fast rate LACP is transmitted once every 1 second. At normal rate LACP is transmitted every 30 seconds after the link is bundled.
+

aliases: rate
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ^interfaces.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • parsed
  • +
  • rendered
  • +
  • gathered
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # lacp port-priority 30 + # interface Ethernet2 + # lacp rate fast + + - name: Merge provided configuration with device configuration + arista.eos.eos_lacp_interfaces: + config: + - name: Ethernet1 + rate: fast + - name: Ethernet2 + rate: normal + state: merged + + # + # ----------- + # After state + # ----------- + # + # veos#show run | section ^interface + # interface Ethernet1 + # lacp port-priority 30 + # lacp rate fast + # interface Ethernet2 + + + # Using replaced + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # lacp port-priority 30 + # interface Ethernet2 + # lacp rate fast + + - name: Replace existing LACP configuration of specified interfaces with provided + configuration + arista.eos.eos_lacp_interfaces: + config: + - name: Ethernet1 + rate: fast + state: replaced + + # + # ----------- + # After state + # ----------- + # + # veos#show run | section ^interface + # interface Ethernet1 + # lacp rate fast + # interface Ethernet2 + # lacp rate fast + + + # Using overridden + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # lacp port-priority 30 + # interface Ethernet2 + # lacp rate fast + + - name: Override the LACP configuration of all the interfaces with provided configuration + arista.eos.eos_lacp_interfaces: + config: + - name: Ethernet1 + rate: fast + state: overridden + + # + # ----------- + # After state + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # lacp rate fast + # interface Ethernet2 + + + # Using deleted + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # lacp port-priority 30 + # interface Ethernet2 + # lacp rate fast + + - name: Delete LACP attributes of given interfaces (or all interfaces if none specified). + arista.eos.eos_lacp_interfaces: + state: deleted + + # + # ----------- + # After state + # ----------- + # + # veos#show run | section ^interface + # interface Ethernet1 + # interface Ethernet2 + + # using rendered: + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_lacp_interfaces: + config: + - name: Ethernet1 + rate: fast + - name: Ethernet2 + rate: normal + state: rendered + + # + # ----------- + # Output + # ----------- + # rendered: + # - "interface Ethernet1" + # - "lacp rate fast" + + # Using parsed: + + # parsed.cfg: + # "interface Ethernet1" + # "lacp rate fast" + # "interface Ethernet2" + + - name: Use parsed to convert native configs to structured data + arista.eos.eos_lacp_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Output: + # parsed: + # - name: Ethernet1 + # rate: fast + # - name: Ethernet2 + # rate: normal + + # Using gathered: + # native config: + # veos#show run | section ^interface + # interface Ethernet1 + # lacp port-priority 30 + # interface Ethernet2 + # lacp rate fast + + - name: Gather LACP facts from the device + arista.eos.eos_lacp_interfaces: + state: gathered + + # Output: + # gathered: + # - name: Ethernet1 + # - name: Ethernet2 + # rate: fast + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['interface Ethernet1', 'lacp rate fast']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@Qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_lacp_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_lacp_module.rst new file mode 100644 index 000000000..c843c1805 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_lacp_module.rst @@ -0,0 +1,327 @@ +.. _arista.eos.eos_lacp_module: + + +******************* +arista.eos.eos_lacp +******************* + +**LACP resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages Global Link Aggregation Control Protocol (LACP) on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
LACP global options.
+
+
+ system + +
+ dictionary +
+
+ +
LACP system options.
+
+
+ priority + +
+ integer +
+
+ +
The system priority to use in LACP negotiations.
+
Lower value is higher priority.
+
Refer to vendor documentation for valid values.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ^lacp.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • deleted
  • +
  • parsed
  • +
  • rendered
  • +
  • gathered
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # veos# show running-config | include lacp + # lacp system-priority 10 + + - name: Merge provided global LACP attributes with device attributes + arista.eos.eos_lacp: + config: + system: + priority: 20 + state: merged + + # After state: + # ------------ + # veos# show running-config | include lacp + # lacp system-priority 20 + # + + + # Using replaced + + # Before state: + # ------------- + # veos# show running-config | include lacp + # lacp system-priority 10 + + - name: Replace device global LACP attributes with provided attributes + arista.eos.eos_lacp: + config: + system: + priority: 20 + state: replaced + + # After state: + # ------------ + # veos# show running-config | include lacp + # lacp system-priority 20 + # + + + # Using deleted + + # Before state: + # ------------- + # veos# show running-config | include lacp + # lacp system-priority 10 + + - name: Delete global LACP attributes + arista.eos.eos_lacp: + state: deleted + + # After state: + # ------------ + # veos# show running-config | include lacp + # + + #Using rendered: + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_lacp: + config: + system: + priority: 20 + state: rendered + + # Output: + # ------------ + # rendered: + # - "lacp system-priority 20" + # + + # Using parsed: + + # parsed.cfg + # lacp system-priority 20 + + - name: Use parsed to convert native configs to structured data + arista.eos.eos_lacp: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Output: + # parsed: + # system: + # priority: 20 + + # Using gathered: + # nathive config: + # ------------- + # lacp system-priority 10 + + - name: Gather lacp facts from the device + arista.eos.eos_lacp: + state: gathered + + # Output: + # gathered: + # system: + # priority: 10 + # + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ dictionary +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ dictionary +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['lacp system-priority 10']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@Qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_lag_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_lag_interfaces_module.rst new file mode 100644 index 000000000..f41e3d283 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_lag_interfaces_module.rst @@ -0,0 +1,443 @@ +.. _arista.eos.eos_lag_interfaces_module: + + +***************************** +arista.eos.eos_lag_interfaces +***************************** + +**LAG interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages attributes of link aggregation groups on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of link aggregation group configurations.
+
+
+ members + +
+ list + / elements=dictionary +
+
+ +
Ethernet interfaces that are part of the group.
+
+
+ member + +
+ string +
+
+ +
Name of ethernet interface that is a member of the LAG.
+
+
+ mode + +
+ string +
+
+
    Choices: +
  • active
  • +
  • on
  • +
  • passive
  • +
+
+
LAG mode for this interface.
+
+
+ name + +
+ string + / required +
+
+ +
Name of the port-channel interface of the link aggregation group (LAG) e.g., Port-Channel5.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section interfaces.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • rendered
  • +
  • gathered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + + - name: Merge provided LAG attributes with existing device configuration + arista.eos.eos_lag_interfaces: + config: + - name: 5 + members: + - member: Ethernet2 + mode: on + state: merged + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + # channel-group 5 mode on + + + # Using replaced + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + + - name: Replace all device configuration of specified LAGs with provided configuration + arista.eos.eos_lag_interfaces: + config: + - name: 5 + members: + - member: Ethernet2 + mode: on + state: replaced + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # interface Ethernet2 + # channel-group 5 mode on + + + # Using overridden + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + + - name: Override all device configuration of all LAG attributes with provided configuration + arista.eos.eos_lag_interfaces: + config: + - name: 10 + members: + - member: Ethernet2 + mode: on + state: overridden + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # interface Ethernet2 + # channel-group 10 mode on + + + # Using deleted + + # Before state: + # ------------- + # + # veos#show running-config | section interface + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + # channel-group 5 mode on + + - name: Delete LAG attributes of the given interfaces. + arista.eos.eos_lag_interfaces: + config: + - name: 5 + members: + - member: Ethernet1 + state: deleted + + # After state: + # ------------ + # + # veos#show running-config | section interface + # interface Ethernet1 + # interface Ethernet2 + # channel-group 5 mode on + + # Using parsed: + + # parsed.cfg + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + # channel-group 5 mode on + + - name: Use parsed to convert native configs to structured data + arista.eos.lag_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Output: + # parsed: + # - name: 5 + # members: + # - member: Ethernet2 + # mode: on + # - member: Ethernet1 + # mode: on + + # using rendered: + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_lag_interfaces: + config: + - name: 5 + members: + - member: Ethernet2 + mode: on + - member: Ethernet1 + mode: on + state: rendered + # ----------- + # Output + # ----------- + # + # rendered: + + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + # channel-group 5 mode on + + + # Using gathered: + + # native config: + # interface Ethernet1 + # channel-group 5 mode on + # interface Ethernet2 + # channel-group 5 mode on + + - name: Gather lldp_global facts from the device + arista.eos.lldp_global: + state: gathered + + # Output: + # gathered: + # - name: 5 + # members: + # - member: Ethernet2 + # mode: on + # - member: Ethernet1 + # mode: on + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['command 1', 'command 2', 'command 3']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@Qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_global_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_global_module.rst new file mode 100644 index 000000000..1cdee66be --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_global_module.rst @@ -0,0 +1,566 @@ +.. _arista.eos.eos_lldp_global_module: + + +************************** +arista.eos.eos_lldp_global +************************** + +**LLDP resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages Global Link Layer Discovery Protocol (LLDP) settings on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
The provided global LLDP configuration.
+
+
+ holdtime + +
+ integer +
+
+ +
Specifies the holdtime (in sec) to be sent in packets.
+
+
+ reinit + +
+ integer +
+
+ +
Specifies the delay (in sec) for LLDP initialization on any interface.
+
+
+ timer + +
+ integer +
+
+ +
Specifies the rate at which LLDP packets are sent (in sec).
+
+
+ tlv_select + +
+ dictionary +
+
+ +
Specifies the LLDP TLVs to enable or disable.
+
+
+ link_aggregation + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable link aggregation TLV.
+
+
+ management_address + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable management address TLV.
+
+
+ max_frame_size + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable maximum frame size TLV.
+
+
+ port_description + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable port description TLV.
+
+
+ system_capabilities + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable system capabilities TLV.
+
+
+ system_description + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable system description TLV.
+
+
+ system_name + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable or disable system name TLV.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section lldp.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • deleted
  • +
  • rendered
  • +
  • gathered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + # + # ------------ + # Before State + # ------------ + # + # veos# show run | section lldp + # lldp timer 3000 + # lldp holdtime 100 + # lldp reinit 5 + # no lldp tlv-select management-address + # no lldp tlv-select system-description + + - name: Merge provided LLDP configuration with the existing configuration + arista.eos.eos_lldp_global: + config: + holdtime: 100 + tlv_select: + management_address: false + port_description: false + system_description: true + state: merged + + # ----------- + # After state + # ----------- + # + # veos# show run | section lldp + # lldp timer 3000 + # lldp holdtime 100 + # lldp reinit 5 + # no lldp tlv-select management-address + # no lldp tlv-select port-description + + + # Using replaced + # + # ------------ + # Before State + # ------------ + # + # veos# show run | section lldp + # lldp timer 3000 + # lldp holdtime 100 + # lldp reinit 5 + # no lldp tlv-select management-address + # no lldp tlv-select system-description + + - name: Replace existing LLDP device configuration with provided configuration + arista.eos.eos_lldp_global: + config: + holdtime: 100 + tlv_select: + management_address: false + port_description: false + system_description: true + state: replaced + + # ----------- + # After state + # ----------- + # + # veos# show run | section lldp + # lldp holdtime 100 + # no lldp tlv-select management-address + # no lldp tlv-select port-description + + + # Using deleted + # + # ------------ + # Before State + # ------------ + # + # veos# show run | section lldp + # lldp timer 3000 + # lldp holdtime 100 + # lldp reinit 5 + # no lldp tlv-select management-address + # no lldp tlv-select system-description + + - name: Delete existing LLDP configurations from the device + arista.eos.eos_lldp_global: + state: deleted + + # ----------- + # After state + # ----------- + # + # veos# show run | section ^lldp + + # Using rendered: + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_lldp_global: + config: + holdtime: 100 + tlv_select: + management_address: false + port_description: false + system_description: true + state: rendered + + # ----------- + # Output + # ----------- + # + # rendered: + # - "lldp holdtime 100" + # - "no lldp tlv-select management-address" + # - "no lldp tlv-select port-description" + + # Using parsed + + # parsed.cfg + + # lldp timer 3000 + # lldp holdtime 100 + # lldp reinit 5 + # no lldp tlv-select management-address + # no lldp tlv-select system-description + + - name: Use parsed to convert native configs to structured data + arista.eos.lldp_global: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # ----------- + # Output + # ----------- + + # parsed: + # holdtime: 100 + # timer 3000 + # reinit 5 + # tlv_select: + # management_address: False + # port_description: False + # system_description: True + + # Using gathered: + # native config: + # lldp timer 3000 + # lldp holdtime 100 + # lldp reinit 5 + # no lldp tlv-select management-address + # no lldp tlv-select system-description + + + - name: Gather lldp_global facts from the device + arista.eos.lldp_global: + state: gathered + + # ----------- + # Output + # ----------- + + # gathered: + # holdtime: 100 + # timer 3000 + # reinit 5 + # tlv_select: + # management_address: False + # port_description: False + # system_description: True + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ dictionary +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ dictionary +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['lldp holdtime 100', 'no lldp timer', 'lldp tlv-select system-description']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@Qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_interfaces_module.rst new file mode 100644 index 000000000..90463d9e0 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_interfaces_module.rst @@ -0,0 +1,443 @@ +.. _arista.eos.eos_lldp_interfaces_module: + + +****************************** +arista.eos.eos_lldp_interfaces +****************************** + +**LLDP interfaces resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages Link Layer Discovery Protocol (LLDP) attributes of interfaces on Arista EOS devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of LLDP interfaces options.
+
+
+ name + +
+ string +
+
+ +
Full name of the interface (i.e. Ethernet1).
+
+
+ receive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable LLDP RX on an interface.
+
+
+ transmit + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable/disable LLDP TX on an interface.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ^interface.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • parsed
  • +
  • gathered
  • +
  • rendered
  • +
+
+
The state of the configuration after module completion.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # no lldp receive + # interface Ethernet2 + # no lldp transmit + + - name: Merge provided configuration with running configuration + arista.eos.eos_lldp_interfaces: + config: + - name: Ethernet1 + transmit: false + - name: Ethernet2 + transmit: false + state: merged + + # + # ------------ + # After state + # ------------ + # + # veos#show run | section ^interface + # interface Ethernet1 + # no lldp transmit + # no lldp receive + # interface Ethernet2 + # no lldp transmit + + + # Using replaced + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # no lldp receive + # interface Ethernet2 + # no lldp transmit + + - name: Replace existing LLDP configuration of specified interfaces with provided + configuration + arista.eos.eos_lldp_interfaces: + config: + - name: Ethernet1 + transmit: false + state: replaced + + # + # ------------ + # After state + # ------------ + # + # veos#show run | section ^interface + # interface Ethernet1 + # no lldp transmit + # interface Ethernet2 + # no lldp transmit + + + # Using overridden + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # no lldp receive + # interface Ethernet2 + # no lldp transmit + + - name: Override the LLDP configuration of all the interfaces with provided configuration + arista.eos.eos_lldp_interfaces: + config: + - name: Ethernet1 + transmit: false + state: overridden + + # + # ------------ + # After state + # ------------ + # + # veos#show run | section ^interface + # interface Ethernet1 + # no lldp transmit + # interface Ethernet2 + + + # Using deleted + # + # + # ------------ + # Before state + # ------------ + # + # + # veos#show run | section ^interface + # interface Ethernet1 + # no lldp receive + # interface Ethernet2 + # no lldp transmit + + - name: Delete LLDP configuration of specified interfaces (or all interfaces if none + are specified) + arista.eos.eos_lldp_interfaces: + state: deleted + + # + # ------------ + # After state + # ------------ + # + # veos#show run | section ^interface + # interface Ethernet1 + # interface Ethernet2 + + # using rendered: + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_lldp_interfaces: + config: + - name: Ethernet1 + transmit: false + - name: Ethernet2 + transmit: false + state: rendered + + # + # ------------ + # Output + # ------------ + # + # interface Ethernet1 + # no lldp transmit + # interface Ethernet2 + # no lldp transmit + + # Using parsed + # parsed.cfg + + # interface Ethernet1 + # no lldp transmit + # interface Ethernet2 + # no lldp transmit + + + - name: Use parsed to convert native configs to structured data + arista.eos.lldp_interfaces: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # ------------ + # Output + # ------------ + + # parsed: + # - name: Ethernet1 + # transmit: False + # - name: Ethernet2 + # transmit: False + + # Using gathered: + + # native config: + # interface Ethernet1 + # no lldp transmit + # interface Ethernet2 + # no lldp transmit + + - name: Gather lldp interfaces facts from the device + arista.eos.lldp_interfaces: + state: gathered + + # ------------ + # Output + # ------------ + + # gathered: + # - name: Ethernet1 + # transmit: False + # - name: Ethernet2 + # transmit: False + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['interface Ethernet1', 'no lldp transmit']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@Qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_module.rst new file mode 100644 index 000000000..0d6863157 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_lldp_module.rst @@ -0,0 +1,124 @@ +.. _arista.eos.eos_lldp_module: + + +******************* +arista.eos.eos_lldp +******************* + +**Manage LLDP configuration on Arista EOS network devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of LLDP service on Arista EOS network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
  • enabled
  • +
  • disabled
  • +
+
+
State of the LLDP configuration. If value is present lldp will be enabled else if it is absent it will be disabled.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: Enable LLDP service + arista.eos.eos_lldp: + state: present + + - name: Disable LLDP service + arista.eos.eos_lldp: + state: absent + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always, except for the platforms that use Netconf transport to manage the device. +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['lldp run']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Ganesh Nalawade (@ganeshrn) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_logging_global_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_logging_global_module.rst new file mode 100644 index 000000000..d159d0de6 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_logging_global_module.rst @@ -0,0 +1,1818 @@ +.. _arista.eos.eos_logging_global_module: + + +***************************** +arista.eos.eos_logging_global +***************************** + +**Manages logging resource module** + + +Version added: 3.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of logging on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A dictionary of logging options
+
+
+ buffered + +
+ dictionary +
+
+ +
Set buffered logging parameters.
+
+
+ buffer_size + +
+ integer +
+
+ +
Logging buffer size
+
+
+ severity + +
+ string +
+
+
    Choices: +
  • emergencies
  • +
  • alerts
  • +
  • critical
  • +
  • errors
  • +
  • warnings
  • +
  • notifications
  • +
  • informational
  • +
  • debugging
  • +
+
+
Severity level .
+
+
+ console + +
+ dictionary +
+
+ +
Set console logging parameters.
+
+
+ severity + +
+ string +
+
+
    Choices: +
  • emergencies
  • +
  • alerts
  • +
  • critical
  • +
  • errors
  • +
  • warnings
  • +
  • notifications
  • +
  • informational
  • +
  • debugging
  • +
+
+
Severity level .
+
+
+ event + +
+ string +
+
+
    Choices: +
  • link-status
  • +
  • port-channel
  • +
  • spanning-tree
  • +
+
+
Global events
+
+
+ facility + +
+ string +
+
+
    Choices: +
  • auth
  • +
  • cron
  • +
  • daemon
  • +
  • kern
  • +
  • local0
  • +
  • local1
  • +
  • local2
  • +
  • local3
  • +
  • local4
  • +
  • local5
  • +
  • local6
  • +
  • local7
  • +
  • lpr
  • +
  • mail
  • +
  • news
  • +
  • sys10
  • +
  • sys11
  • +
  • sys12
  • +
  • sys13
  • +
  • sys14
  • +
  • sys9
  • +
  • syslog
  • +
  • user
  • +
  • uucp
  • +
+
+
Set logging facility.
+
+
+ format + +
+ dictionary +
+
+ +
Set logging format parameters
+
+
+ hostname + +
+ string +
+
+ +
Specify hostname logging format.
+
+
+ sequence_numbers + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
No. of log messages.
+
+
+ timestamp + +
+ dictionary +
+
+ +
Set timestamp logging parameters.
+
+
+ high_resolution + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
RFC3339 timestamps.
+
+
+ traditional + +
+ dictionary +
+
+ +
Traditional syslog timestamp format as specified in RFC3164.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • enabled
  • +
  • disabled
  • +
+
+
When enabled traditional timestamp format is set.
+
+
+ timezone + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Show timezone in traditional format timestamp
+
+
+ year + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Show year in traditional format timestamp
+
+
+ hosts + +
+ list + / elements=dictionary +
+
+ +
Set syslog server IP address and parameters.
+
+
+ add + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure ports on the given host.
+
+
+ name + +
+ string +
+
+ +
Hostname or IP address of the syslog server.
+
+
+ port + +
+ integer +
+
+ +
Port of the syslog server.
+
+
+ protocol + +
+ string +
+
+
    Choices: +
  • tcp
  • +
  • udp
  • +
+
+
Set syslog server transport protocol
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove configured ports from the given host
+
+
+ level + +
+ dictionary +
+
+ +
Configure logging severity
+
+
+ facility + +
+ string +
+
+ +
Facility level
+
+
+ severity + +
+ string +
+
+
    Choices: +
  • emergencies
  • +
  • alerts
  • +
  • critical
  • +
  • errors
  • +
  • warnings
  • +
  • notifications
  • +
  • informational
  • +
  • debugging
  • +
+
+
Severity level .
+
+
+ monitor + +
+ string +
+
+ +
Set terminal monitor severity
+
+
+ persistent + +
+ dictionary +
+
+ +
Save logging messages to the flash disk.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Save logging messages to the flash dis.
+
+
+ size + +
+ integer +
+
+ +
The maximum size (in bytes) of logging file stored on flash disk.
+
+
+ policy + +
+ dictionary +
+
+ +
Configure logging policies.
+
+
+ invert_result + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Invert the match of match-list.
+
+
+ match_list + +
+ string +
+
+ +
Configure logging message filtering.
+
+
+ qos + +
+ integer +
+
+ +
Set DSCP value in IP header.
+
+
+ relogging_interval + +
+ integer +
+
+ +
Configure relogging-interval for critical log messages
+
+
+ repeat_messages + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Repeat messages instead of summarizing number of repeats
+
+
+ source_interface + +
+ string +
+
+ +
Use IP Address of interface as source IP of log messages.
+
+
+ synchronous + +
+ dictionary +
+
+ +
Set synchronizing unsolicited with solicited messages
+
+
+ level + +
+ string +
+
+ +
Configure logging severity
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set synchronizing unsolicited with solicited messages.
+
+
+ trap + +
+ dictionary +
+
+ +
Severity of messages sent to the syslog server.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Severity of messages sent to the syslog server.
+
+
+ severity + +
+ string +
+
+
    Choices: +
  • emergencies
  • +
  • alerts
  • +
  • critical
  • +
  • errors
  • +
  • warnings
  • +
  • notifications
  • +
  • informational
  • +
  • debugging
  • +
+
+
Severity level .
+
+
+ turn_on + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Turn on logging.
+
+
+ vrfs + +
+ list + / elements=dictionary +
+
+ +
Specify vrf
+
+
+ hosts + +
+ list + / elements=dictionary +
+
+ +
Set syslog server IP address and parameters.
+
+
+ add + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure ports on the given host.
+
+
+ name + +
+ string +
+
+ +
Hostname or IP address of the syslog server.
+
+
+ port + +
+ integer +
+
+ +
Port of the syslog server.
+
+
+ protocol + +
+ string +
+
+
    Choices: +
  • tcp
  • +
  • udp
  • +
+
+
Set syslog server transport protocol
+
+
+ remove + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove configured ports from the given host
+
+
+ name + +
+ string +
+
+ +
vrf name.
+
+
+ source_interface + +
+ string +
+
+ +
Use IP Address of interface as source IP of log messages.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section access-list.
+
The states replaced and overridden have identical behaviour for this module.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6M + - This module works with connection ``network_cli``. See the `EOS Platform Options `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state + + # test(config)#show running-config | section logging + # test(config)# + + - name: Merge provided configuration with device configuration + arista.eos.eos_logging_global: + config: + hosts: + - name: "host01" + protocol: "tcp" + - name: "11.11.11.1" + port: 25 + vrfs: + - name: "vrf01" + source_interface: "Ethernet1" + - name: "vrf02" + hosts: + - name: "hostvrf1" + protocol: "tcp" + - name: "24.1.1.1" + port: "33" + + # After State: + + # test(config)#show running-config | section logging + # logging host 11.11.11.1 25 + # logging host host01 514 protocol tcp + # logging vrf vrf02 host 24.1.1.1 33 + # logging vrf vrf02 host hostvrf1 514 protocol tcp + # logging vrf vrf01 source-interface Ethernet1 + # test(config)# + # + # + # Module Execution: + # "after": { + # "hosts": [ + # { + # "name": "11.11.11.1", + # "port": 25 + # }, + # { + # "name": "host01", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "vrfs": [ + # { + # "name": "vrf01", + # "source_interface": "Ethernet1" + # }, + # { + # "hosts": [ + # { + # "name": "24.1.1.1", + # "port": 33 + # }, + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf02" + # } + # ] + # }, + # "before": {}, + # "changed": true, + # "commands": [ + # "logging host host01 protocol tcp", + # "logging host 11.11.11.1 25", + # "logging vrf vrf01 source-interface Ethernet1", + # "logging vrf vrf02 host hostvrf1 protocol tcp", + # "logging vrf vrf02 host 24.1.1.1 33" + # ], + # + + # Using replaced: + # Before State: + + # test(config)#show running-config | section logging + # logging host 11.11.11.1 25 + # logging host host01 514 protocol tcp + # logging vrf vrf02 host 24.1.1.1 33 + # logging vrf vrf02 host hostvrf1 514 protocol tcp + # logging format timestamp traditional timezone + # logging vrf vrf01 source-interface Ethernet1 + # logging policy match inverse-result match-list list01 discard + # logging persistent 4096 + # ! + # logging level AAA alerts + # test(config)# + + - name: Repalce + arista.eos.eos_logging_global: + config: + synchronous: + set: True + trap: + severity: "critical" + hosts: + - name: "host02" + protocol: "tcp" + vrfs: + - name: "vrf03" + source_interface: "Vlan100" + - name: "vrf04" + hosts: + - name: "hostvrf1" + protocol: "tcp" + + state: replaced + + # After State: + # test(config)#show running-config | section logging + # logging synchronous + # logging trap critical + # logging host host02 514 protocol tcp + # logging vrf vrf04 host hostvrf1 514 protocol tcp + # logging vrf vrf03 source-interface Vlan100 + # test(config)# + # + # Module Execution: + # "after": { + # "hosts": [ + # { + # "name": "host02", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "synchronous": { + # "set": True + # }, + # "trap": { + # "severity": "critical" + # }, + # "vrfs": [ + # { + # "name": "vrf03", + # "source_interface": "Vlan100" + # }, + # { + # "hosts": [ + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf04" + # } + # ] + # }, + # "before": { + # "format": { + # "timestamp": { + # "traditional": { + # "timezone": true + # } + # } + # }, + # "hosts": [ + # { + # "name": "11.11.11.1", + # "port": 25 + # }, + # { + # "name": "host01", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "level": { + # "facility": "AAA", + # "severity": "alerts" + # }, + # "persistent": { + # "size": 4096 + # }, + # "policy": { + # "invert_result": true, + # "match_list": "list01" + # }, + # "vrfs": [ + # { + # "name": "vrf01", + # "source_interface": "Ethernet1" + # }, + # { + # "hosts": [ + # { + # "name": "24.1.1.1", + # "port": 33 + # }, + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf02" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "logging host host02 protocol tcp", + # "no logging host 11.11.11.1 25", + # "no logging host host01 514 protocol tcp", + # "logging vrf vrf03 source-interface Vlan100", + # "logging vrf vrf04 host hostvrf1 protocol tcp", + # "no logging vrf vrf01 source-interface Ethernet1", + # "no logging vrf vrf02 host 24.1.1.1 33", + # "no logging vrf vrf02 host hostvrf1 514 protocol tcp", + # "no logging format timestamp traditional timezone", + # "no logging level AAA alerts", + # "no logging persistent 4096", + # "no logging policy match invert-result match-list list01 discard", + # "logging synchronous", + # "logging trap critical" + # ], + # + # + + + # Using overridden: + # Before State: + + # test(config)#show running-config | section logging + # logging host 11.11.11.1 25 + # logging host host01 514 protocol tcp + # logging vrf vrf02 host 24.1.1.1 33 + # logging vrf vrf02 host hostvrf1 514 protocol tcp + # logging format timestamp traditional timezone + # logging vrf vrf01 source-interface Ethernet1 + # logging policy match inverse-result match-list list01 discard + # logging persistent 4096 + # ! + # logging level AAA alerts + # test(config)# + + - name: Repalce + arista.eos.eos_logging_global: + config: + synchronous: + set: True + trap: + severity: "critical" + hosts: + - name: "host02" + protocol: "tcp" + vrfs: + - name: "vrf03" + source_interface: "Vlan100" + - name: "vrf04" + hosts: + - name: "hostvrf1" + protocol: "tcp" + + state: overridden + + # After State: + # test(config)#show running-config | section logging + # logging synchronous + # logging trap critical + # logging host host02 514 protocol tcp + # logging vrf vrf04 host hostvrf1 514 protocol tcp + # logging vrf vrf03 source-interface Vlan100 + # test(config)# + # + # Module Execution: + # "after": { + # "hosts": [ + # { + # "name": "host02", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "synchronous": { + # "set": True + # }, + # "trap": { + # "severity": "critical" + # }, + # "vrfs": [ + # { + # "name": "vrf03", + # "source_interface": "Vlan100" + # }, + # { + # "hosts": [ + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf04" + # } + # ] + # }, + # "before": { + # "format": { + # "timestamp": { + # "traditional": { + # "timezone": true + # } + # } + # }, + # "hosts": [ + # { + # "name": "11.11.11.1", + # "port": 25 + # }, + # { + # "name": "host01", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "level": { + # "facility": "AAA", + # "severity": "alerts" + # }, + # "persistent": { + # "size": 4096 + # }, + # "policy": { + # "invert_result": true, + # "match_list": "list01" + # }, + # "vrfs": [ + # { + # "name": "vrf01", + # "source_interface": "Ethernet1" + # }, + # { + # "hosts": [ + # { + # "name": "24.1.1.1", + # "port": 33 + # }, + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf02" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "logging host host02 protocol tcp", + # "no logging host 11.11.11.1 25", + # "no logging host host01 514 protocol tcp", + # "logging vrf vrf03 source-interface Vlan100", + # "logging vrf vrf04 host hostvrf1 protocol tcp", + # "no logging vrf vrf01 source-interface Ethernet1", + # "no logging vrf vrf02 host 24.1.1.1 33", + # "no logging vrf vrf02 host hostvrf1 514 protocol tcp", + # "no logging format timestamp traditional timezone", + # "no logging level AAA alerts", + # "no logging persistent 4096", + # "no logging policy match invert-result match-list list01 discard", + # "logging synchronous", + # "logging trap critical" + # ], + # + # + + # Using deleted: + + # Before State: + # test(config)#show running-config | section logging + # logging synchronous level critical + # logging host 11.11.11.1 25 + # logging host host01 514 protocol tcp + # logging host host02 514 protocol tcp + # logging vrf vrf02 host 24.1.1.1 33 + # logging vrf vrf02 host hostvrf1 514 protocol tcp + # logging vrf vrf04 host hostvrf1 514 protocol tcp + # logging vrf vrf01 source-interface Ethernet1 + # logging vrf vrf03 source-interface Vlan100 + # test(config)# + + - name: Delete all logging configs + arista.eos.eos_logging_global: + state: deleted + become: yes + + # After state: + # test(config)#show running-config | section logging + # test(config)# + # + # "after": {}, + # "before": { + # "hosts": [ + # { + # "name": "11.11.11.1", + # "port": 25 + # }, + # { + # "name": "host01", + # "port": 514, + # "protocol": "tcp" + # }, + # { + # "name": "host02", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "synchronous": { + # "level": "critical" + # }, + # "vrfs": [ + # { + # "name": "vrf01", + # "source_interface": "Ethernet1" + # }, + # { + # "hosts": [ + # { + # "name": "24.1.1.1", + # "port": 33 + # }, + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf02" + # }, + # { + # "name": "vrf03", + # "source_interface": "Vlan100" + # }, + # { + # "hosts": [ + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf04" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "no logging host 11.11.11.1 25", + # "no logging host host01 514 protocol tcp", + # "no logging host host02 514 protocol tcp", + # "no logging vrf vrf01 source-interface Ethernet1", + # "no logging vrf vrf02 host 24.1.1.1 33", + # "no logging vrf vrf02 host hostvrf1 514 protocol tcp", + # "no logging vrf vrf03 source-interface Vlan100", + # "no logging vrf vrf04 host hostvrf1 514 protocol tcp", + # "no logging synchronous level critical" + # ], + + # Using parsed: + # parsed.cfg + + # logging host 11.11.11.1 25 + # logging host host01 514 protocol tcp + # logging vrf vrf02 host 24.1.1.1 33 + # logging vrf vrf02 host hostvrf1 514 protocol tcp + # logging format timestamp traditional timezone + # logging vrf vrf01 source-interface Ethernet1 + # logging policy match inverse-result match-list list01 discard + # logging persistent 4096 + # ! + # logging level AAA alerts + + - name: parse configs + arista.eos.eos_logging_global: + running_config: "{{ lookup('file', './parsed.cfg') }}" + state: parsed + + # Module Execution + # "parsed": { + # "format": { + # "timestamp": { + # "traditional": { + # "timezone": true + # } + # } + # }, + # "hosts": [ + # { + # "name": "11.11.11.1", + # "port": 25 + # }, + # { + # "name": "host01", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "level": { + # "facility": "AAA", + # "severity": "alerts" + # }, + # "persistent": { + # "size": 4096 + # }, + # "policy": { + # "invert_result": true, + # "match_list": "list01" + # }, + # "vrfs": [ + # { + # "name": "vrf01", + # "source_interface": "Ethernet1" + # }, + # { + # "hosts": [ + # { + # "name": "24.1.1.1", + # "port": 33 + # }, + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf02" + # } + # ] + # } + # + + # Using gathered: + # Before State: + # test(config)#show running-config | section logging + # logging host 11.11.11.1 25 + # logging host host01 514 protocol tcp + # logging vrf vrf02 host 24.1.1.1 33 + # logging vrf vrf02 host hostvrf1 514 protocol tcp + # logging format timestamp traditional timezone + # logging vrf vrf01 source-interface Ethernet1 + # logging policy match inverse-result match-list list01 discard + # logging persistent 4096 + # ! + # logging level AAA alerts + # test(config)# + + - name: gather configs + arista.eos.eos_logging_global: + state: gathered + + # Module Execution: + # "gathered": { + # "format": { + # "timestamp": { + # "traditional": { + # "timezone": true + # } + # } + # }, + # "hosts": [ + # { + # "name": "11.11.11.1", + # "port": 25 + # }, + # { + # "name": "host01", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "level": { + # "facility": "AAA", + # "severity": "alerts" + # }, + # "persistent": { + # "size": 4096 + # }, + # "policy": { + # "invert_result": true, + # "match_list": "list01" + # }, + # "vrfs": [ + # { + # "name": "vrf01", + # "source_interface": "Ethernet1" + # }, + # { + # "hosts": [ + # { + # "name": "24.1.1.1", + # "port": 33 + # }, + # { + # "name": "hostvrf1", + # "port": 514, + # "protocol": "tcp" + # } + # ], + # "name": "vrf02" + # } + # ] + # }, + # + + # Using rendered: + - name: Render provided configuration + arista.eos.eos_logging_global: + config: + format: + timestamp: + traditional: + timezone: True + level: + facility: "AAA" + severity: "alerts" + persistent: + size: 4096 + policy: + invert_result: True + match_list: "list01" + hosts: + - name: "host01" + protocol: "tcp" + - name: "11.11.11.1" + port: 25 + vrfs: + - name: "vrf01" + source_interface: "Ethernet1" + - name: "vrf02" + hosts: + - name: "hostvrf1" + protocol: "tcp" + - name: "24.1.1.1" + port: "33" + # Module Execution: + + # "rendered": [ + # "logging host host01 protocol tcp", + # "logging host 11.11.11.1 25", + # "logging vrf vrf01 source-interface Ethernet1", + # "logging vrf vrf02 host hostvrf1 protocol tcp", + # "logging vrf vrf02 host 24.1.1.1 33", + # "logging format timestamp traditional timezone", + # "logging level AAA alerts", + # "logging persistent 4096", + # "logging policy match invert-result match-list list01 discard" + # ] + # + + + + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_logging_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_logging_module.rst new file mode 100644 index 000000000..bcdb50a43 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_logging_module.rst @@ -0,0 +1,388 @@ +.. _arista.eos.eos_logging_module: + + +********************** +arista.eos.eos_logging +********************** + +**Manage logging on network devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + +DEPRECATED +---------- +:Removed in collection release after 2024-01-01 +:Why: Updated module released with more functionality. +:Alternative: eos_logging_global + + + +Synopsis +-------- +- This module provides declarative management of logging on Arista Eos devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of logging definitions.
+
+
+ dest + +
+ string +
+
+
    Choices: +
  • on
  • +
  • host
  • +
  • console
  • +
  • monitor
  • +
  • buffered
  • +
+
+
Destination of the logs.
+
+
+ facility + +
+ string +
+
+ +
Set logging facility.
+
+
+ level + +
+ string +
+
+
    Choices: +
  • emergencies
  • +
  • alerts
  • +
  • critical
  • +
  • errors
  • +
  • warnings
  • +
  • notifications
  • +
  • informational
  • +
  • debugging
  • +
+
+
Set logging severity levels.
+
+
+ name + +
+ string +
+
+ +
The hostname or IP address of the destination.
+
Required when dest=host.
+
+
+ size + +
+ integer +
+
+ +
Size of buffer. The acceptable value is in range from 10 to 2147483647 bytes.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the logging configuration.
+
+
+ dest + +
+ string +
+
+
    Choices: +
  • on
  • +
  • host
  • +
  • console
  • +
  • monitor
  • +
  • buffered
  • +
+
+
Destination of the logs.
+
+
+ facility + +
+ string +
+
+ +
Set logging facility.
+
+
+ level + +
+ string +
+
+
    Choices: +
  • emergencies
  • +
  • alerts
  • +
  • critical
  • +
  • errors
  • +
  • warnings
  • +
  • notifications
  • +
  • informational
  • +
  • debugging
  • +
+
+
Set logging severity levels.
+
+
+ name + +
+ string +
+
+ +
The hostname or IP address of the destination.
+
Required when dest=host.
+
+
+ size + +
+ integer +
+
+ +
Size of buffer. The acceptable value is in range from 10 to 2147483647 bytes.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the logging configuration.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure host logging + arista.eos.eos_logging: + dest: host + name: 172.16.0.1 + state: present + + - name: remove host logging configuration + arista.eos.eos_logging: + dest: host + name: 172.16.0.1 + state: absent + + - name: configure console logging level and facility + arista.eos.eos_logging: + dest: console + facility: local7 + level: debugging + state: present + + - name: enable logging to all + arista.eos.eos_logging: + dest: on + + - name: configure buffer size + arista.eos.eos_logging: + dest: buffered + size: 5000 + + - name: Configure logging using aggregate + arista.eos.eos_logging: + aggregate: + - {dest: console, level: warnings} + - {dest: buffered, size: 480000} + state: present + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['logging facility local7', 'logging host 172.16.0.1']
+
+

+ + +Status +------ + + +- This module will be removed in a release after 2024-01-01. *[deprecated]* +- For more information see `DEPRECATED`_. + + +Authors +~~~~~~~ + +- Trishna Guha (@trishnaguha) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_ntp_global_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_ntp_global_module.rst new file mode 100644 index 000000000..eea1b5e73 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_ntp_global_module.rst @@ -0,0 +1,1605 @@ +.. _arista.eos.eos_ntp_global_module: + + +************************* +arista.eos.eos_ntp_global +************************* + +**Manages ntp resource module** + + +Version added: 3.1.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of ntp on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A dictionary of ntp options
+
+
+ authenticate + +
+ dictionary +
+
+ +
Require authentication for NTP synchronization.
+
+
+ enable + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable authentication for NTP synchronization.
+
+
+ servers + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Authentication required only for incoming NTP server responses.
+
+
+ authentication_keys + +
+ list + / elements=dictionary +
+
+ +
Define a key to use for authentication.
+
+
+ algorithm + +
+ string +
+
+
    Choices: +
  • md5
  • +
  • sha1
  • +
+
+
hash algorithm,
+
+
+ encryption + +
+ integer +
+
+
    Choices: +
  • 0
  • +
  • 7
  • +
+
+
key type
+
+
+ id + +
+ integer +
+
+ +
key identifier.
+
+
+ key + +
+ string +
+
+ +
Unobfuscated key string.
+
+
+ local_interface + +
+ string +
+
+ +
Configure the interface from which the IP source address is taken.
+
+
+ qos_dscp + +
+ integer +
+
+ +
Set DSCP value in IP header
+
+
+ serve + +
+ dictionary +
+
+ +
Configure the switch as an NTP server.
+
+
+ access_lists + +
+ list + / elements=dictionary +
+
+ +
Configure access control list.
+
+
+ acls + +
+ list + / elements=dictionary +
+
+ +
Access lists to be configured under the afi
+
+
+ acl_name + +
+ string +
+
+ +
Name of the access list.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • in
  • +
  • out
  • +
+
+
direction for the packets.
+
+
+ vrf + +
+ string +
+
+ +
VRF in which to apply the access control list.
+
+
+ afi + +
+ string +
+
+ +
ip/ipv6 config commands.
+
+
+ all + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Service NTP requests received on any interface.
+
+
+ servers + +
+ list + / elements=dictionary +
+
+ +
Configure NTP server to synchronize to.
+
+
+ burst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Send a burst of packets instead of the usual one.
+
+
+ iburst + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Send bursts of packets until the server is reached
+
+
+ key_id + +
+ integer +
+
+ +
Set a key to use for authentication.
+
+
+ local_interface + +
+ string +
+
+ +
Configure the interface from which the IP source address is taken.
+
+
+ maxpoll + +
+ integer +
+
+ +
Maximum poll interval.
+
+
+ minpoll + +
+ integer +
+
+ +
Minimum poll interval.
+
+
+ prefer + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Mark this server as preferred.
+
+
+ server + +
+ string + / required +
+
+ +
Hostname or A.B.C.D or A:B:C:D:E:F:G:H.
+
+
+ source + +
+ string +
+
+ +
Configure the interface from which the IP source address is taken.
+
+
+ version + +
+ integer +
+
+ +
NTP version.
+
+
+ vrf + +
+ string +
+
+ +
vrf name.
+
+
+ trusted_key + +
+ string +
+
+ +
Configure the set of keys that are accepted for incoming messages
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ntp.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
The states replaced and overridden have identical behaviour for this module.
+
Please refer to examples for more details.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.60M + - This module works with connection ``network_cli``. See the https://docs.ansible.com/ansible/latest/network/user_guide/platform_eos.html. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state + + # localhost(config)#show running-config | section ntp + # localhost(config)# + + - name: Merge provided configuration with device configuration + arista.eos.eos_ntp_global: + config: + authenticate: + enable: true + authentication_keys: + - id: 2 + algorithm: "sha1" + encryption: 7 + key: "123456" + - id: 23 + algorithm: "md5" + encryption: 7 + key: "123456" + local_interface: "Ethernet1" + qos_dscp: 10 + trusted_key: 23 + servers: + - server: "10.1.1.1" + vrf: "vrf01" + burst: True + prefer: True + - server: "25.1.1.1" + vrf: "vrf01" + maxpoll: 15 + key_id: 2 + serve: + access_lists: + - afi: "ip" + acls: + - acl_name: "acl01" + direction: "in" + - afi: "ipv6" + acls: + - acl_name: "acl02" + direction: "in" + + # After State + + # localhost(config)#show running-config | section ntp + # ntp authentication-key 2 sha1 7 123456 + # ntp authentication-key 23 md5 7 123456 + # ntp trusted-key 23 + # ntp authenticate + # ntp local-interface Ethernet1 + # ntp qos dscp 10 + # ntp server vrf vrf01 10.1.1.1 prefer burst + # ntp server vrf vrf01 25.1.1.1 maxpoll 15 key 2 + # ntp serve ip access-group acl01 in + # ntp serve ipv6 access-group acl02 in + # localhost(config)# + # + # + # Module Execution: + # "after": { + # "authenticate": { + # "enable": true + # }, + # "authentication_keys": [ + # { + # "algorithm": "sha1", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # }, + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 23, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "local_interface": "Ethernet1", + # "qos_dscp": 10, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl01", + # "direction": "in" + # } + # ], + # "afi": "ip" + # }, + # { + # "acls": [ + # { + # "acl_name": "acl02", + # "direction": "in" + # } + # ], + # "afi": "ipv6" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "prefer": true, + # "server": "10.1.1.1", + # "vrf": "vrf01" + # }, + # { + # "key_id": 2, + # "maxpoll": 15, + # "server": "25.1.1.1", + # "vrf": "vrf01" + # } + # ], + # "trusted_key": "23" + # }, + # "before": {}, + # "changed": true, + # "commands": [ + # "ntp serve ip access-group acl01 in", + # "ntp serve ipv6 access-group acl02 in", + # "ntp authentication-key 2 sha1 7 ********", + # "ntp authentication-key 23 md5 7 ********", + # "ntp server vrf vrf01 10.1.1.1 burst prefer", + # "ntp server vrf vrf01 25.1.1.1 key 2 maxpoll 15", + # "ntp authenticate", + # "ntp local-interface Ethernet1", + # "ntp qos dscp 10", + # "ntp trusted-key 23" + # ], + + # Using Replaced + + # Before State + + # localhost(config)#show running-config | section ntp + # ntp authentication-key 2 sha1 7 123456 + # ntp authentication-key 23 md5 7 123456 + # ntp trusted-key 23 + # ntp authenticate + # ntp local-interface Ethernet1 + # ntp qos dscp 10 + # ntp server vrf vrf01 10.1.1.1 prefer burst + # ntp server vrf vrf01 25.1.1.1 maxpoll 15 key 2 + # ntp serve ip access-group acl01 in + # ntp serve ipv6 access-group acl02 in + # localhost(config)# + + - name: Replace + arista.eos.eos_ntp_global: + config: + qos_dscp: 15 + authentication_keys: + - id: 2 + algorithm: "md5" + encryption: 7 + key: "123456" + servers: + - server: "11.21.1.1" + vrf: "vrf01" + burst: True + prefer: True + minpoll: 13 + serve: + access_lists: + - afi: "ip" + acls: + - acl_name: "acl03" + direction: "in" + state: replaced + # After State: + # localhost(config)#show running-config | section ntp + # ntp authentication-key 2 md5 7 123456 + # ntp qos dscp 15 + # ntp server vrf vrf01 11.21.1.1 prefer burst minpoll 13 + # ntp serve ip access-group acl03 in + # localhost(config)# + # + # + # Module Execution: + # "after": { + # "authentication_keys": [ + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "qos_dscp": 15, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl03", + # "direction": "in" + # } + # ], + # "afi": "ip" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "minpoll": 13, + # "prefer": true, + # "server": "11.21.1.1", + # "vrf": "vrf01" + # } + # ] + # }, + # "before": { + # "authenticate": { + # "enable": true + # }, + # "authentication_keys": [ + # { + # "algorithm": "sha1", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # }, + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 23, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "local_interface": "Ethernet1", + # "qos_dscp": 10, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl01", + # "direction": "in" + # } + # ], + # "afi": "ip" + # }, + # { + # "acls": [ + # { + # "acl_name": "acl02", + # "direction": "in" + # } + # ], + # "afi": "ipv6" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "prefer": true, + # "server": "10.1.1.1", + # "vrf": "vrf01" + # }, + # { + # "key_id": 2, + # "maxpoll": 15, + # "server": "25.1.1.1", + # "vrf": "vrf01" + # } + # ], + # "trusted_key": "23" + # }, + # "changed": true, + # "commands": [ + # "no ntp serve ip access-group acl01 in", + # "no ntp serve ipv6 access-group acl02 in", + # "no ntp authentication-key 23 md5 7 ********", + # "no ntp server vrf vrf01 10.1.1.1 burst prefer", + # "no ntp server vrf vrf01 25.1.1.1 key 2 maxpoll 15", + # "no ntp authenticate", + # "no ntp local-interface Ethernet1", + # "no ntp trusted-key 23", + # "ntp serve ip access-group acl03 in", + # "ntp authentication-key 2 md5 7 ********", + # "ntp server vrf vrf01 11.21.1.1 burst minpoll 13 prefer", + # "ntp qos dscp 15" + # ], + # + # Using Overridden + + # Before State + + # localhost(config)#show running-config | section ntp + # ntp authentication-key 2 sha1 7 123456 + # ntp authentication-key 23 md5 7 123456 + # ntp trusted-key 23 + # ntp authenticate + # ntp local-interface Ethernet1 + # ntp qos dscp 10 + # ntp server vrf vrf01 10.1.1.1 prefer burst + # ntp server vrf vrf01 25.1.1.1 maxpoll 15 key 2 + # ntp serve ip access-group acl01 in + # ntp serve ipv6 access-group acl02 in + # localhost(config)# + + - name: Replace + arista.eos.eos_ntp_global: + config: + qos_dscp: 15 + authentication_keys: + - id: 2 + algorithm: "md5" + encryption: 7 + key: "123456" + servers: + - server: "11.21.1.1" + vrf: "vrf01" + burst: True + prefer: True + minpoll: 13 + serve: + access_lists: + - afi: "ip" + acls: + - acl_name: "acl03" + direction: "in" + state: overridden + # After State: + # localhost(config)#show running-config | section ntp + # ntp authentication-key 2 md5 7 123456 + # ntp qos dscp 15 + # ntp server vrf vrf01 11.21.1.1 prefer burst minpoll 13 + # ntp serve ip access-group acl03 in + # localhost(config)# + # + # + # Module Execution: + # "after": { + # "authentication_keys": [ + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "qos_dscp": 15, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl03", + # "direction": "in" + # } + # ], + # "afi": "ip" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "minpoll": 13, + # "prefer": true, + # "server": "11.21.1.1", + # "vrf": "vrf01" + # } + # ] + # }, + # "before": { + # "authenticate": { + # "enable": true + # }, + # "authentication_keys": [ + # { + # "algorithm": "sha1", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # }, + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 23, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "local_interface": "Ethernet1", + # "qos_dscp": 10, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl01", + # "direction": "in" + # } + # ], + # "afi": "ip" + # }, + # { + # "acls": [ + # { + # "acl_name": "acl02", + # "direction": "in" + # } + # ], + # "afi": "ipv6" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "prefer": true, + # "server": "10.1.1.1", + # "vrf": "vrf01" + # }, + # { + # "key_id": 2, + # "maxpoll": 15, + # "server": "25.1.1.1", + # "vrf": "vrf01" + # } + # ], + # "trusted_key": "23" + # }, + # "changed": true, + # "commands": [ + # "no ntp serve ip access-group acl01 in", + # "no ntp serve ipv6 access-group acl02 in", + # "no ntp authentication-key 23 md5 7 ********", + # "no ntp server vrf vrf01 10.1.1.1 burst prefer", + # "no ntp server vrf vrf01 25.1.1.1 key 2 maxpoll 15", + # "no ntp authenticate", + # "no ntp local-interface Ethernet1", + # "no ntp trusted-key 23", + # "ntp serve ip access-group acl03 in", + # "ntp authentication-key 2 md5 7 ********", + # "ntp server vrf vrf01 11.21.1.1 burst minpoll 13 prefer", + # "ntp qos dscp 15" + # ], + # + + # using deleted: + # Before State + + # localhost(config)#show running-config | section ntp + # ntp authentication-key 2 sha1 7 123456 + # ntp authentication-key 23 md5 7 123456 + # ntp trusted-key 23 + # ntp authenticate + # ntp local-interface Ethernet1 + # ntp qos dscp 10 + # ntp server vrf vrf01 10.1.1.1 prefer burst + # ntp server vrf vrf01 11.21.1.1 prefer burst minpoll 13 + # ntp server vrf vrf01 25.1.1.1 maxpoll 15 key 2 + # ntp serve ip access-group acl01 in + # ntp serve ipv6 access-group acl02 in + # localhost(config)# + + - name: Delete ntp-global + arista.eos.eos_ntp_global: + state: deleted + + # After State: + # localhost(config)#show running-config | section ntp + # localhost(config)# + # + # + # # Module Execution + # "after": {}, + # "before": { + # "authenticate": { + # "enable": true + # }, + # "authentication_keys": [ + # { + # "algorithm": "sha1", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # }, + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 23, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "local_interface": "Ethernet1", + # "qos_dscp": 10, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl01", + # "direction": "in" + # } + # ], + # "afi": "ip" + # }, + # { + # "acls": [ + # { + # "acl_name": "acl02", + # "direction": "in" + # } + # ], + # "afi": "ipv6" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "prefer": true, + # "server": "10.1.1.1", + # "vrf": "vrf01" + # }, + # { + # "burst": true, + # "minpoll": 13, + # "prefer": true, + # "server": "11.21.1.1", + # "vrf": "vrf01" + # }, + # { + # "key": 2, + # "maxpoll": 15, + # "server": "25.1.1.1", + # "vrf": "vrf01" + # } + # ], + # "trusted_key": "23" + # }, + # "changed": true, + # "commands": [ + # "no ntp serve ip access-group acl01 in", + # "no ntp serve ipv6 access-group acl02 in", + # "no ntp authentication-key 2 sha1 7 ********", + # "no ntp authentication-key 23 md5 7 ********", + # "no ntp server vrf vrf01 10.1.1.1 burst prefer", + # "no ntp server vrf vrf01 11.21.1.1 burst minpoll 13 prefer", + # "no ntp server vrf vrf01 25.1.1.1 key 2 maxpoll 15", + # "no ntp authenticate", + # "no ntp local-interface Ethernet1", + # "no ntp qos dscp 10", + # "no ntp trusted-key 23" + # ], + # + + # Using parsed: + # parsed.cfg + # ntp authentication-key 2 sha1 7 123456 + # ntp authentication-key 23 md5 7 123456 + # ntp trusted-key 23 + # ntp authenticate + # ntp local-interface Ethernet1 + # ntp qos dscp 10 + # ntp server vrf vrf01 10.1.1.1 prefer burst + # ntp server vrf vrf01 11.21.1.1 prefer burst minpoll 13 + # ntp server vrf vrf01 25.1.1.1 maxpoll 15 key 2 + # ntp serve ip access-group acl01 in + # ntp serve ipv6 access-group acl02 in + + - name: parse configs + arista.eos.eos_ntp_global: + running_config: "{{ lookup('file', './parsed_ntp_global.cfg') }}" + state: parsed + tags: + - parsed + # Module Execution + # "parsed": { + # "authenticate": { + # "enable": true + # }, + # "authentication_keys": [ + # { + # "algorithm": "sha1", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # }, + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 23, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "local_interface": "Ethernet1", + # "qos_dscp": 10, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl01", + # "direction": "in" + # } + # ], + # "afi": "ip" + # }, + # { + # "acls": [ + # { + # "acl_name": "acl02", + # "direction": "in" + # } + # ], + # "afi": "ipv6" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "prefer": true, + # "server": "10.1.1.1", + # "vrf": "vrf01" + # }, + # { + # "burst": true, + # "minpoll": 13, + # "prefer": true, + # "server": "11.21.1.1", + # "vrf": "vrf01" + # }, + # { + # "key": 2, + # "maxpoll": 15, + # "server": "25.1.1.1", + # "vrf": "vrf01" + # } + # ], + # "trusted_key": "23" + # } + # } + + # using Gathered + # Device config: + # localhost(config)#show running-config | section ntp + # ntp authentication-key 2 sha1 7 123456 + # ntp authentication-key 23 md5 7 123456 + # ntp trusted-key 23 + # ntp authenticate + # ntp local-interface Ethernet1 + # ntp qos dscp 10 + # ntp server vrf vrf01 10.1.1.1 prefer burst + # ntp server vrf vrf01 25.1.1.1 maxpoll 15 key 2 + # ntp serve ip access-group acl01 in + # ntp serve ipv6 access-group acl02 in + # localhost(config)# + + + - name: gather configs + arista.eos.eos_ntp_global: + state: gathered + tags: + - gathered + # Module Execution + # "gathered": { + # "authenticate": { + # "enable": true + # }, + # "authentication_keys": [ + # { + # "algorithm": "sha1", + # "encryption": 7, + # "id": 2, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # }, + # { + # "algorithm": "md5", + # "encryption": 7, + # "id": 23, + # "key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER" + # } + # ], + # "local_interface": "Ethernet1", + # "qos_dscp": 10, + # "serve": { + # "access_lists": [ + # { + # "acls": [ + # { + # "acl_name": "acl01", + # "direction": "in" + # } + # ], + # "afi": "ip" + # }, + # { + # "acls": [ + # { + # "acl_name": "acl02", + # "direction": "in" + # } + # ], + # "afi": "ipv6" + # } + # ] + # }, + # "servers": [ + # { + # "burst": true, + # "prefer": true, + # "server": "10.1.1.1", + # "vrf": "vrf01" + # }, + # { + # "key_id": 2, + # "maxpoll": 15, + # "server": "25.1.1.1", + # "vrf": "vrf01" + # } + # ], + # "trusted_key": "23" + # }, + # "invocation": { + # "module_args": { + # "config": null, + # "running_config": null, + # "state": "gathered" + # } + # } + # } + + + # using rendered: + + - name: Render provided configuration + arista.eos.eos_ntp_global: + config: + authenticate: + enable: true + authentication_keys: + - id: 2 + algorithm: "sha1" + encryption: 7 + key: "123456" + - id: 23 + algorithm: "md5" + encryption: 7 + key: "123456" + local_interface: "Ethernet1" + qos_dscp: 10 + trusted_key: 23 + servers: + - server: "10.1.1.1" + vrf: "vrf01" + burst: True + prefer: True + - server: "25.1.1.1" + vrf: "vrf01" + maxpoll: 15 + key_id: 2 + serve: + access_lists: + - afi: "ip" + acls: + - acl_name: "acl01" + direction: "in" + - afi: "ipv6" + acls: + - acl_name: "acl02" + direction: "in" + state: rendered + become: yes + + # Module Execution: + # "rendered": [ + # "ntp serve ip access-group acl01 in", + # "ntp serve ipv6 access-group acl02 in", + # "ntp authentication-key 2 sha1 7 ********", + # "ntp authentication-key 23 md5 7 ********", + # "ntp server vrf vrf01 10.1.1.1 burst prefer", + # "ntp server vrf vrf01 25.1.1.1 key 2 maxpoll 15", + # "ntp authenticate", + # "ntp local-interface Ethernet1", + # "ntp qos dscp 10", + # "ntp trusted-key 23" + # ] + # + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ dictionary +
+
when changed +
The resulting configuration after module execution.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ before + +
+ dictionary +
+
when state is merged, replaced, overridden, deleted or purged +
The configuration prior to the module execution.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ commands + +
+ list +
+
when state is merged, replaced, overridden, deleted or purged +
The set of commands pushed to the remote device.
+
+
Sample:
+
['ntp master stratum 2', 'ntp peer 198.51.100.1 use-vrf test maxpoll 7', 'ntp authentication-key 10 md5 wawyhanx2 7', 'ntp access-group peer PeerAcl1', 'ntp access-group peer PeerAcl2', 'ntp access-group query-only QueryAcl1']
+
+
+ gathered + +
+ list +
+
when state is gathered +
Facts about the network resource gathered from the remote device as structured data.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ parsed + +
+ list +
+
when state is parsed +
The device native config provided in running_config option parsed into structured data as per module argspec.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ rendered + +
+ list +
+
when state is rendered +
The provided configuration in the task rendered in device-native format (offline).
+
+
Sample:
+
['ntp authentication-key 2 sha1 7 123456', 'ntp authentication-key 23 md5 7 123456', 'ntp trusted-key 23', 'ntp authenticate', 'ntp local-interface Ethernet1', 'ntp qos dscp 10', 'ntp server vrf vrf01 10.1.1.1 prefer burst', 'ntp server vrf vrf01 25.1.1.1 maxpoll 15 key 2', 'ntp serve ip access-group acl01 in', 'ntp serve ipv6 access-group acl02 in']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_ospf_interfaces_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_ospf_interfaces_module.rst new file mode 100644 index 000000000..52844cc67 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_ospf_interfaces_module.rst @@ -0,0 +1,2026 @@ +.. _arista.eos.eos_ospf_interfaces_module: + + +****************************** +arista.eos.eos_ospf_interfaces +****************************** + +**OSPF Interfaces Resource Module.** + + +Version added: 1.1.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module manages OSPF configuration of interfaces on devices running Arista EOS. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of OSPF configuration for interfaces.
+
+
+ address_family + +
+ list + / elements=dictionary +
+
+ +
OSPF settings on the interfaces in address-family context.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Address Family Identifier (AFI) for OSPF settings on the interfaces.
+
+
+ area + +
+ dictionary +
+
+ +
Area associated with interface.
+
Valid only when afi = ipv4.
+
+
+ area_id + +
+ string + / required +
+
+ +
Area ID as a decimal or IP address format.
+
+
+ authentication_key + +
+ dictionary +
+
+ +
Configure the authentication key for the interface.
+
Valid only when afi = ipv4.
+
+
+ encryption + +
+ string +
+
+ +
0 Specifies an UNENCRYPTED authentication key will follow.
+
7 Specifies a proprietry encryption type.`
+
+
+ key + +
+ string +
+
+ +
password (up to 8 chars).
+
+
+ authentication_v2 + +
+ dictionary +
+
+ +
Authentication settings on the interface.
+
Valid only when afi = ipv4.
+
+
+ message_digest + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use message-digest authentication.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable authentication on the interface.
+
+
+ authentication_v3 + +
+ dictionary +
+
+ +
Authentication settings on the interface.
+
Valid only when afi = ipv6.
+
+
+ algorithm + +
+ string +
+
+
    Choices: +
  • md5
  • +
  • sha1
  • +
+
+
Encryption alsgorithm.
+
+
+ key + +
+ string +
+
+ +
128 bit MD5 key or 140 bit SHA1 key.
+
+
+ keytype + +
+ string +
+
+ +
Specifies if an unencrypted/hidden follows.
+
0 denotes unencrypted key.
+
7 denotes hidden key.
+
+
+ passphrase + +
+ string +
+
+ +
Passphrase String for deriving keys for authentication and encryption.
+
+
+ spi + +
+ integer +
+
+ +
IPsec Security Parameter Index.
+
+
+ bfd + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BFD.
+
+
+ cost + +
+ integer +
+
+ +
metric associated with interface.
+
+
+ dead_interval + +
+ integer +
+
+ +
Time interval to detect a dead router.
+
+
+ encryption_v3 + +
+ dictionary +
+
+ +
Authentication settings on the interface.
+
Valid only when afi = ipv6.
+
+
+ algorithm + +
+ string +
+
+
    Choices: +
  • md5
  • +
  • sha1
  • +
+
+
algorithm.
+
+
+ encryption + +
+ string +
+
+
    Choices: +
  • 3des-cbc
  • +
  • aes-128-cbc
  • +
  • aes-192-cbc
  • +
  • aes-256-cbc
  • +
  • null
  • +
+
+
encryption type.
+
+
+ key + +
+ string +
+
+ +
key
+
+
+ keytype + +
+ string +
+
+ +
Specifies if an unencrypted/hidden follows.
+
0 denotes unencrypted key.
+
7 denotes hidden key.
+
+
+ passphrase + +
+ string +
+
+ +
Passphrase String for deriving keys for authentication and encryption.
+
+
+ spi + +
+ integer +
+
+ +
IPsec Security Parameter Index.
+
+
+ hello_interval + +
+ integer +
+
+ +
Timer interval between transmission of hello packets.
+
+
+ ip_params + +
+ list + / elements=dictionary +
+
+ +
Specify parameters for IPv4/IPv6.
+
Valid only when afi = ipv6.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Address Family Identifier (AFI) for OSPF settings on the interfaces.
+
+
+ area + +
+ dictionary +
+
+ +
Area associated with interface.
+
Valid only when afi = ipv4.
+
+
+ area_id + +
+ string + / required +
+
+ +
Area ID as a decimal or IP address format.
+
+
+ bfd + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BFD.
+
+
+ cost + +
+ integer +
+
+ +
metric associated with interface.
+
+
+ dead_interval + +
+ integer +
+
+ +
Time interval to detect a dead router.
+
+
+ hello_interval + +
+ integer +
+
+ +
Timer interval between transmission of hello packets.
+
+
+ mtu_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if True, Disable MTU check for Database Description packets.
+
+
+ network + +
+ string +
+
+ +
Interface type.
+
+
+ passive_interface + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress routing updates in an interface.
+
+
+ priority + +
+ integer +
+
+ +
Interface priority.
+
+
+ retransmit_interval + +
+ integer +
+
+ +
LSA retransmission interval.
+
+
+ transmit_delay + +
+ integer +
+
+ +
LSA transmission delay.
+
+
+ message_digest_key + +
+ dictionary +
+
+ +
Message digest authentication password (key) settings.
+
+
+ encryption + +
+ string +
+
+ +
0 Specifies an UNENCRYPTED ospf password (key) will follow.
+
7 Specifies a proprietry encryption type.
+
+
+ key + +
+ string +
+
+ +
Authentication key (upto 16 chars).
+
+
+ key_id + +
+ integer +
+
+ +
Key ID.
+
+
+ mtu_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if True, Disable MTU check for Database Description packets.
+
+
+ network + +
+ string +
+
+ +
Interface type.
+
+
+ passive_interface + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Suppress routing updates in an interface.
+
Valid only when afi = ipv6.
+
+
+ priority + +
+ integer +
+
+ +
Interface priority.
+
+
+ retransmit_interval + +
+ integer +
+
+ +
LSA retransmission interval.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Shutdown OSPF on this interface.
+
+
+ transmit_delay + +
+ integer +
+
+ +
LSA transmission delay.
+
+
+ name + +
+ string +
+
+ +
Name/Identifier of the interface.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section interface.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • gathered
  • +
  • parsed
  • +
  • rendered
  • +
+
+
The state the configuration should be left in.
+
+
+ + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state + + # veos(config)#show running-config | section interface | ospf + # veos(config)# + + - name: Merge provided configuration with device configuration + arista.eos.eos_ospf_interfaces: + config: + - name: "Vlan1" + address_family: + - afi: "ipv4" + area: + area_id: "0.0.0.50" + cost: 500 + mtu_ignore: True + - afi: "ipv6" + dead_interval: 44 + ip_params: + - afi: "ipv6" + mtu_ignore: True + network: "point-to-point" + state: merged + + # After State + + # veos(config)#show running-config | section interface | ospf + # interface Vlan1 + # ip ospf cost 500 + # ip ospf mtu-ignore + # ip ospf area 0.0.0.50 + # ospfv3 dead-interval 44 + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # veos(config)# + # + # + # Module Execution: + # + # "after": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.50" + # }, + # "cost": 500, + # "mtu_ignore": True + # }, + # { + # "afi": "ipv6", + # "dead_interval": 44, + # "ip_params": [ + # { + # "afi": "ipv6", + # "mtu_ignore": True, + # "network": "point-to-point" + # } + # ] + # } + # ], + # "name": "Vlan1" + # } + # ], + # "before": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # } + # ], + # "changed": True, + # "commands": [ + # "interface Vlan1", + # "ip ospf area 0.0.0.50", + # "ip ospf cost 500", + # "ip ospf mtu-ignore", + # "ospfv3 dead-interval 44", + # "ospfv3 ipv6 mtu-ignore", + # "ospfv3 ipv6 network point-to-point" + # ], + # + + # Using replaced + #--------------- + + # Before State: + + # veos(config)#show running-config | section interface | ospf + # interface Vlan1 + # ip ospf cost 500 + # ip ospf dead-interval 29 + # ip ospf hello-interval 66 + # ip ospf mtu-ignore + # ip ospf area 0.0.0.50 + # ospfv3 cost 106 + # ospfv3 hello-interval 77 + # ospfv3 dead-interval 44 + # ospfv3 transmit-delay 100 + # ospfv3 ipv4 priority 45 + # ospfv3 ipv4 area 0.0.0.5 + # ospfv3 ipv6 passive-interface + # ospfv3 ipv6 retransmit-interval 115 + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # ! + # interface Vlan2 + # ospfv3 ipv4 hello-interval 45 + # ospfv3 ipv4 retransmit-interval 100 + # ospfv3 ipv4 area 0.0.0.6 + # veos(config)# + + + - name: Replace device configuration with provided configuration + arista.eos.eos_ospf_interfaces: + config: + - name: "Vlan1" + address_family: + - afi: "ipv6" + cost: 44 + bfd: True + ip_params: + - afi: "ipv6" + mtu_ignore: True + network: "point-to-point" + dead_interval: 56 + state: replaced + + # After State: + + # veos(config)#show running-config | section interface | ospf + # interface Vlan1 + # ospfv3 bfd + # ospfv3 cost 44 + # no ospfv3 ipv6 passive-interface + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # ! + # interface Vlan2 + # ospfv3 ipv4 hello-interval 45 + # ospfv3 ipv4 retransmit-interval 100 + # ospfv3 ipv4 area 0.0.0.6 + # veos(config)# + # + # Module Execution: + # + # "after": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "bfd": True, + # "cost": 44, + # "ip_params": [ + # { + # "afi": "ipv6", + # "mtu_ignore": True, + # "network": "point-to-point" + # } + # ] + # } + # ], + # "name": "Vlan1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.6" + # }, + # "hello_interval": 45, + # "retransmit_interval": 100 + # } + # ] + # } + # ], + # "name": "Vlan2" + # } + # ], + # "before": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.50" + # }, + # "cost": 500, + # "dead_interval": 29, + # "hello_interval": 66, + # "mtu_ignore": True + # }, + # { + # "afi": "ipv6", + # "cost": 106, + # "dead_interval": 44, + # "hello_interval": 77, + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.5" + # }, + # "priority": 45 + # }, + # { + # "afi": "ipv6", + # "mtu_ignore": True, + # "network": "point-to-point", + # "passive_interface": True, + # "retransmit_interval": 115 + # } + # ], + # "transmit_delay": 100 + # } + # ], + # "name": "Vlan1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.6" + # }, + # "hello_interval": 45, + # "retransmit_interval": 100 + # } + # ] + # } + # ], + # "name": "Vlan2" + # } + # ], + # "changed": True, + # "commands": [ + # "interface Vlan1", + # "no ip ospf cost 500", + # "no ip ospf dead-interval 29", + # "no ip ospf hello-interval 66", + # "no ip ospf mtu-ignore", + # "no ip ospf area 0.0.0.50", + # "ospfv3 cost 44", + # "ospfv3 bfd", + # "ospfv3 authentication ipsec spi 30 md5 passphrase 7 7hl8FV3lZ6H1mAKpjL47hQ==", + # "no ospfv3 ipv4 priority 45", + # "no ospfv3 ipv4 area 0.0.0.5", + # "ospfv3 ipv6 dead-interval 56", + # "no ospfv3 ipv6 passive-interface", + # "no ospfv3 ipv6 retransmit-interval 115", + # "no ospfv3 hello-interval 77", + # "no ospfv3 dead-interval 44", + # "no ospfv3 transmit-delay 100" + # ], + # + + # Using overidden: + # ---------------- + + # Before State: + # veos(config)#show running-config | section interface | ospf + # interface Vlan1 + # ip ospf dead-interval 29 + # ip ospf hello-interval 66 + # ip ospf mtu-ignore + # ospfv3 bfd + # ospfv3 cost 106 + # ospfv3 hello-interval 77 + # ospfv3 transmit-delay 100 + # ospfv3 ipv4 priority 45 + # ospfv3 ipv4 area 0.0.0.5 + # ospfv3 ipv6 passive-interface + # ospfv3 ipv6 dead-interval 56 + # ospfv3 ipv6 retransmit-interval 115 + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # ! + # interface Vlan2 + # ospfv3 ipv4 hello-interval 45 + # ospfv3 ipv4 retransmit-interval 100 + # ospfv3 ipv4 area 0.0.0.6 + # veos(config)# + + - name: Override device configuration with provided configuration + arista.eos.eos_ospf_interfaces: + config: + - name: "Vlan1" + address_family: + - afi: "ipv6" + cost: 44 + bfd: True + ip_params: + - afi: "ipv6" + mtu_ignore: True + network: "point-to-point" + dead_interval: 56 + state: overridden + + # After State: + + # veos(config)#show running-config | section interface | ospf + # interface Vlan1 + # ospfv3 bfd + # ospfv3 cost 44 + # no ospfv3 ipv6 passive-interface + # ospfv3 ipv6 dead-interval 56 + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # veos(config)# + # + # + # Module Execution: + # + # "after": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "bfd": True, + # "cost": 44, + # "ip_params": [ + # { + # "afi": "ipv6", + # "dead_interval": 56, + # "mtu_ignore": True, + # "network": "point-to-point" + # } + # ] + # } + # ], + # "name": "Vlan1" + # }, + # { + # "name": "Vlan2" + # } + # ], + # "before": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "dead_interval": 29, + # "hello_interval": 66, + # "mtu_ignore": True + # }, + # { + # "afi": "ipv6", + # "bfd": True, + # "cost": 106, + # "hello_interval": 77, + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.5" + # }, + # "priority": 45 + # }, + # { + # "afi": "ipv6", + # "dead_interval": 56, + # "mtu_ignore": True, + # "network": "point-to-point", + # "passive_interface": True, + # "retransmit_interval": 115 + # } + # ], + # "transmit_delay": 100 + # } + # ], + # "name": "Vlan1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.6" + # }, + # "hello_interval": 45, + # "retransmit_interval": 100 + # } + # ] + # } + # ], + # "name": "Vlan2" + # } + # ], + # "changed": True, + # "commands": [ + # "interface Vlan2", + # "no ospfv3 ipv4 hello-interval 45", + # "no ospfv3 ipv4 retransmit-interval 100", + # "no ospfv3 ipv4 area 0.0.0.6", + # "interface Vlan1", + # "no ip ospf dead-interval 29", + # "no ip ospf hello-interval 66", + # "no ip ospf mtu-ignore", + # "ospfv3 cost 44", + # "ospfv3 authentication ipsec spi 30 md5 passphrase 7 7hl8FV3lZ6H1mAKpjL47hQ==", + # "no ospfv3 ipv4 priority 45", + # "no ospfv3 ipv4 area 0.0.0.5", + # "no ospfv3 ipv6 passive-interface", + # "no ospfv3 ipv6 retransmit-interval 115", + # "no ospfv3 hello-interval 77", + # "no ospfv3 transmit-delay 100" + # ], + # + + # Using deleted: + #-------------- + + # before State: + + # veos(config)#show running-config | section interface | ospf + # interface Vlan1 + # ip ospf dead-interval 29 + # ip ospf hello-interval 66 + # ip ospf mtu-ignore + # ospfv3 bfd + # ospfv3 cost 106 + # ospfv3 hello-interval 77 + # ospfv3 transmit-delay 100 + # ospfv3 ipv4 priority 45 + # ospfv3 ipv4 area 0.0.0.5 + # ospfv3 ipv6 passive-interface + # ospfv3 ipv6 dead-interval 56 + # ospfv3 ipv6 retransmit-interval 115 + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # ! + # interface Vlan2 + # ospfv3 ipv4 hello-interval 45 + # ospfv3 ipv4 retransmit-interval 100 + # ospfv3 ipv4 area 0.0.0.6 + # veos(config)# + + - name: Delete device configuration + arista.eos.eos_ospf_interfaces: + config: + - name: "Vlan1" + state: deleted + + # After State: + + # veos#show running-config | section interface | ospf + # interface Vlan2 + # ospfv3 ipv4 hello-interval 45 + # ospfv3 ipv4 retransmit-interval 100 + # ospfv3 ipv4 area 0.0.0.6 + # + # Module Execution: + # + # "after": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "name": "Vlan1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.6" + # }, + # "hello_interval": 45, + # "retransmit_interval": 100 + # } + # ] + # } + # ], + # "name": "Vlan2" + # } + # ], + # "before": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "dead_interval": 29, + # "hello_interval": 66, + # "mtu_ignore": True + # }, + # { + # "afi": "ipv6", + # "bfd": True, + # "cost": 106, + # "hello_interval": 77, + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.5" + # }, + # "priority": 45 + # }, + # { + # "afi": "ipv6", + # "dead_interval": 56, + # "mtu_ignore": True, + # "network": "point-to-point", + # "passive_interface": True, + # "retransmit_interval": 115 + # } + # ], + # "transmit_delay": 100 + # } + # ], + # "name": "Vlan1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.6" + # }, + # "hello_interval": 45, + # "retransmit_interval": 100 + # } + # ] + # } + # ], + # "name": "Vlan2" + # } + # ], + # "changed": True, + # "commands": [ + # "interface Vlan1", + # "no ip ospf dead-interval 29", + # "no ip ospf hello-interval 66", + # "no ip ospf mtu-ignore", + # "no ospfv3 bfd", + # "no ospfv3 cost 106", + # "no ospfv3 hello-interval 77", + # "no ospfv3 transmit-delay 100", + # "no ospfv3 ipv4 priority 45", + # "no ospfv3 ipv4 area 0.0.0.5", + # "no ospfv3 ipv6 passive-interface", + # "no ospfv3 ipv6 dead-interval 56", + # "no ospfv3 ipv6 retransmit-interval 115", + # "no ospfv3 ipv6 network point-to-point", + # "no ospfv3 ipv6 mtu-ignore" + # ], + # + + # Using parsed: + # ------------ + + # parsed.cfg: + # ---------- + + # interface Vlan1 + # ip ospf dead-interval 29 + # ip ospf hello-interval 66 + # ip ospf mtu-ignore + # ip ospf cost 500 + # ospfv3 bfd + # ospfv3 cost 106 + # ospfv3 hello-interval 77 + # ospfv3 transmit-delay 100 + # ospfv3 ipv4 priority 45 + # ospfv3 ipv4 area 0.0.0.5 + # ospfv3 ipv6 passive-interface + # ospfv3 ipv6 dead-interval 56 + # ospfv3 ipv6 retransmit-interval 115 + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # ! + # interface Vlan2 + # ospfv3 ipv4 hello-interval 45 + # ospfv3 ipv4 retransmit-interval 100 + # ospfv3 ipv4 area 0.0.0.6 + # + + - name: parse configs + arista.eos.eos_ospf_interfaces: + running_config: "{{ lookup('file', './parsed.cfg') }}" + state: parsed + + # Module Execution: + # "parsed": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "cost": 500, + # "dead_interval": 29, + # "hello_interval": 66, + # "mtu_ignore": True + # }, + # { + # "afi": "ipv6", + # "bfd": True, + # "cost": 106, + # "hello_interval": 77, + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.5" + # }, + # "priority": 45 + # }, + # { + # "afi": "ipv6", + # "dead_interval": 56, + # "mtu_ignore": True, + # "network": "point-to-point", + # "passive_interface": True, + # "retransmit_interval": 115 + # } + # ], + # "transmit_delay": 100 + # } + # ], + # "name": "Vlan1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.6" + # }, + # "hello_interval": 45, + # "retransmit_interval": 100 + # } + # ] + # } + # ], + # "name": "Vlan2" + # } + # ] + + # Using gathered: + + # Device COnfig: + + # veos#show running-config | section interface | ospf + # interface Vlan1 + # ip ospf cost 500 + # ip ospf dead-interval 29 + # ip ospf hello-interval 66 + # ip ospf mtu-ignore + # ip ospf area 0.0.0.50 + # ospfv3 cost 106 + # ospfv3 hello-interval 77 + # ospfv3 transmit-delay 100 + # ospfv3 ipv4 priority 45 + # ospfv3 ipv4 area 0.0.0.5 + # ospfv3 ipv6 passive-interface + # ospfv3 ipv6 dead-interval 56 + # ospfv3 ipv6 retransmit-interval 115 + # ospfv3 ipv6 network point-to-point + # ospfv3 ipv6 mtu-ignore + # ! + # interface Vlan2 + # ospfv3 ipv4 hello-interval 45 + # ospfv3 ipv4 retransmit-interval 100 + # ospfv3 ipv4 area 0.0.0.6 + # veos# + + - name: gather configs + arista.eos.eos_ospf_interfaces: + state: gathered + + # Module Execution: + # + # "gathered": [ + # { + # "name": "Ethernet1" + # }, + # { + # "name": "Ethernet2" + # }, + # { + # "name": "Management1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.50" + # }, + # "cost": 500, + # "dead_interval": 29, + # "hello_interval": 66, + # "mtu_ignore": True + # }, + # { + # "afi": "ipv6", + # "cost": 106, + # "hello_interval": 77, + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.5" + # }, + # "priority": 45 + # }, + # { + # "afi": "ipv6", + # "dead_interval": 56, + # "mtu_ignore": True, + # "network": "point-to-point", + # "passive_interface": True, + # "retransmit_interval": 115 + # } + # ], + # "transmit_delay": 100 + # } + # ], + # "name": "Vlan1" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "ip_params": [ + # { + # "afi": "ipv4", + # "area": { + # "area_id": "0.0.0.6" + # }, + # "hello_interval": 45, + # "retransmit_interval": 100 + # } + # ] + # } + # ], + # "name": "Vlan2" + # } + # ], + # + + + # Using rendered: + # -------------- + + - name: Render provided configuration + arista.eos.eos_ospf_interfaces: + config: + - name: "Vlan1" + address_family: + - afi: "ipv4" + dead_interval: 29 + mtu_ignore: True + hello_interval: 66 + - afi: "ipv6" + hello_interval: 77 + cost : 106 + transmit_delay: 100 + ip_params: + - afi: "ipv6" + retransmit_interval: 115 + dead_interval: 56 + passive_interface: True + - afi: "ipv4" + area: + area_id: "0.0.0.5" + priority: 45 + - name: "Vlan2" + address_family: + - afi: "ipv6" + ip_params: + - afi: "ipv4" + area: + area_id: "0.0.0.6" + hello_interval: 45 + retransmit_interval: 100 + - afi: "ipv4" + message_digest_key: + key_id: 200 + encryption: 7 + key: "hkdfhtu==" + + state: rendered + + # Module Execution: + # + # "rendered": [ + # "interface Vlan1", + # "ip ospf dead-interval 29", + # "ip ospf mtu-ignore", + # "ip ospf hello-interval 66", + # "ospfv3 hello-interval 77", + # "ospfv3 cost 106", + # "ospfv3 transmit-delay 100", + # "ospfv3 ipv4 area 0.0.0.5", + # "ospfv3 ipv4 priority 45", + # "ospfv3 ipv6 retransmit-interval 115", + # "ospfv3 ipv6 dead-interval 56", + # "ospfv3 ipv6 passive-interface", + # "interface Vlan2", + # "ip ospf message-digest-key 200 md5 7 hkdfhtu==", + # "ospfv3 ipv4 area 0.0.0.6", + # "ospfv3 ipv4 hello-interval 45", + # "ospfv3 ipv4 retransmit-interval 100" + # ] + # + + + + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_ospfv2_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_ospfv2_module.rst new file mode 100644 index 000000000..187a2985a --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_ospfv2_module.rst @@ -0,0 +1,3752 @@ +.. _arista.eos.eos_ospfv2_module: + + +********************* +arista.eos.eos_ospfv2 +********************* + +**OSPFv2 resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of ospfv2 on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A list of configurations for ospfv2.
+
+
+ processes + +
+ list + / elements=dictionary +
+
+ +
A list of dictionary specifying the ospfv2 processes.
+
+
+ adjacency + +
+ dictionary +
+
+ +
Configure adjacency options for OSPF instance.
+
+
+ exchange_start + +
+ dictionary +
+
+ +
Configure exchange-start options for OSPF instance.
+
+
+ threshold + +
+ integer +
+
+ +
Number of peers to bring up simultaneously.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Specifies the configuration for OSPF areas
+
+
+ area_id + +
+ string +
+
+ +
Specifies a 32 bit number expressed in decimal or dotted-decimal notation.
+
+
+ default_cost + +
+ integer +
+
+ +
Specify the cost for default summary route in stub/NSSA area.
+
+
+ filter + +
+ dictionary +
+
+ +
Specify the filter for incoming summary LSAs.
+
+
+ address + +
+ string +
+
+ +
IP address.
+
+
+ prefix_list + +
+ string +
+
+ +
Specify list to filter for incoming LSAs.
+
+
+ subnet_address + +
+ string +
+
+ +
IP address with mask length
+
+
+ subnet_mask + +
+ string +
+
+ +
IP subnet mask
+
+
+ not_so_stubby + +
+ dictionary +
+
+ +
Configures NSSA parameters.
+
+
+ default_information_originate + +
+ dictionary +
+
+ +
Originate default Type 7 LSA.
+
+
+ metric + +
+ integer +
+
+ +
Metric for default route.
+
+
+ metric_type + +
+ integer +
+
+ +
Metric type for default route.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Limit default advertisement to this NSSA area.
+
+
+ lsa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
lsa parameters
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Filter all type-3 LSAs in the nssa area.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable Type-7 LSA p-bit setting
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set config up to not-so-stubby
+
+
+ nssa + +
+ dictionary +
+
+ +
Configures NSSA parameters.
+
+
+ default_information_originate + +
+ dictionary +
+
+ +
Originate default Type 7 LSA.
+
+
+ metric + +
+ integer +
+
+ +
Metric for default route.
+
+
+ metric_type + +
+ integer +
+
+ +
Metric type for default route.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Limit default advertisement to this NSSA area.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Filter all type-3 LSAs in the nssa area.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable Type-7 LSA p-bit setting
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set config up to nssa
+
+
+ range + +
+ dictionary +
+
+ +
Configure route summarization.
+
+
+ address + +
+ string +
+
+ +
IP address.
+
+
+ advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable Advertisement of the range.
+
+
+ cost + +
+ integer +
+
+ +
Configures the metric.
+
+
+ subnet_address + +
+ string +
+
+ +
IP address with mask length
+
+
+ subnet_mask + +
+ string +
+
+ +
IP subnet mask
+
+
+ stub + +
+ dictionary +
+
+ +
Stub area.
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If False , Filter all type-3 LSAs in the stub area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true sets the stub config alone.
+
+
+ auto_cost + +
+ dictionary +
+
+ +
Set auto-cost.
+
+
+ reference_bandwidth + +
+ integer +
+
+ +
reference bandwidth in megabits per sec.
+
+
+ bfd + +
+ dictionary +
+
+ +
Enable BFD.
+
+
+ all_interfaces + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BFD on all interfaces.
+
+
+ default_information + +
+ dictionary +
+
+ +
Control distribution of default information.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always advertise default route.
+
+
+ metric + +
+ integer +
+
+ +
Metric for default route.
+
+
+ metric_type + +
+ integer +
+
+ +
Metric type for default route.
+
+
+ originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Distribute a default route.
+
+
+ route_map + +
+ string +
+
+ +
Specify which route-map to use.
+
+
+ default_metric + +
+ integer +
+
+ +
Configure the default metric for redistributed routes
+
+
+ distance + +
+ dictionary +
+
+ +
Specifies the administrative distance for routes.
+
+
+ external + +
+ integer +
+
+ +
Routes external to the area
+
+
+ inter_area + +
+ integer +
+
+ +
Routes from other areas
+
+
+ intra_area + +
+ integer +
+
+ +
Routes with in an area
+
+
+ distribute_list + +
+ dictionary +
+
+ +
Specifies the list of routes to be filtered.
+
+
+ prefix_list + +
+ string +
+
+ +
prefix list to be filtered
+
+
+ route_map + +
+ string +
+
+ +
route map to be filtered
+
+
+ dn_bit_ignore + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Disable dn-bit check for Type-3 LSAs in non-default VRFs.
+
+
+ fips_restrictions + +
+ string +
+
+ +
Use FIPS compliant algorithms
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Enable graceful restart mode.
+
+
+ grace_period + +
+ integer +
+
+ +
Specify maximum time to wait for graceful-restart to complete.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true sets the grace_fulrestart config alone.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Enable graceful restart helper.
+
+
+ log_adjacency_changes + +
+ dictionary +
+
+ +
To configure link-state changes and transitions of OSPFv2 neighbors.
+
+
+ detail + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If true , configures the switch to log all link-state changes.
+
+
+ max_lsa + +
+ dictionary +
+
+ +
Specifies the switch behavior on reaching max lsa count.
+
+
+ count + +
+ integer +
+
+ +
maximum count of lsas.
+
+
+ ignore_count + +
+ integer +
+
+ +
No. of times the switch can shut down temporarily on warning
+
+
+ ignore_time + +
+ integer +
+
+ +
time in minutes, for which the switch shoud be shutdown on max-lsa warning
+
+
+ reset_time + +
+ integer +
+
+ +
Time in minutes, after which the shutdown counter resets.
+
+
+ threshold + +
+ integer +
+
+ +
percentage of <count> , when a warning should be raised.
+
+
+ warning + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Only give warning message when limit is exceeded
+
+
+ max_metric + +
+ dictionary +
+
+ +
Set maximum metric.
+
+
+ router_lsa + +
+ dictionary +
+
+ +
Maximum metric in self-originated router-LSAs.
+
+
+ external_lsa + +
+ dictionary +
+
+ +
Override external-lsa metric with max-metric value.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ include_stub + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set maximum metric for stub links in router-LSAs.
+
+
+ on_startup + +
+ dictionary +
+
+ +
Set maximum metric temporarily after reboot.
+
+
+ wait_period + +
+ integer +
+
+ +
Wait period in seconds after startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set router-lsa attribute.
+
+
+ summary_lsa + +
+ dictionary +
+
+ +
Override summary-lsa metric with max-metric value.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ maximum_paths + +
+ integer +
+
+ +
Maximum number of next-hops in an ECMP route.
+
+
+ mpls_ldp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
mpls ldp sync configuration.
+
+
+ networks + +
+ list + / elements=dictionary +
+
+ +
Configure routing for a network.
+
+
+ area + +
+ string +
+
+ +
Configure OSPF area.
+
+
+ mask + +
+ string +
+
+ +
Network Wildcard Mask.
+
+
+ network_address + +
+ string +
+
+ +
Network Address.
+
+
+ prefix + +
+ string +
+
+ +
Prefix.
+
+
+ passive_interface + +
+ dictionary +
+
+ +
Include interface but without actively running OSPF.
+
+
+ default + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Set all interfaces to passive by default
+
+
+ interface_list + +
+ string +
+
+ +
Interface range.
+
+
+ point_to_point + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure Point-to-point specific features.
+
+
+ process_id + +
+ integer +
+
+ +
ID of OSPFV2 process.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Specifies the routes to be redistributed
+
+
+ isis_level + +
+ string +
+
+ +
ISIS levels.
+
+
+ route_map + +
+ string +
+
+ +
Specify which route map to use.
+
+
+ routes + +
+ string +
+
+ +
Route types (BGP,isis,connected etc)
+
+
+ retransmission_threshold + +
+ integer +
+
+ +
Configure threshold for retransmission.
+
+
+ rfc1583compatibility + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Specifies different methods for calculating summary route metrics.
+
+
+ router_id + +
+ string +
+
+ +
32-bit number assigned to a router running OSPFv2.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable the OSPF instance.
+
+
+ summary_address + +
+ dictionary +
+
+ +
Summary route configuration.
+
+
+ address + +
+ string +
+
+ +
IP summary address.
+
+
+ attribute_map + +
+ string +
+
+ +
Set attributes of summary route.
+
+
+ mask + +
+ string +
+
+ +
Summary Mask.
+
+
+ not_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not advertise summary route.
+
+
+ prefix + +
+ string +
+
+ +
Prefix.
+
+
+ tag + +
+ integer +
+
+ +
Set tag.
+
+
+ timers + +
+ list + / elements=dictionary +
+
+ +
Configure OSPF timers.
+
+
+ lsa + +
+ dictionary +
+
+ +
Configure OSPF LSA timers.
+
+
+ rx + +
+ dictionary +
+
+ +
Configure OSPF LSA receiving timers
+
+
+ min_interval + +
+ integer +
+
+ +
Configure OSPF LSA arrival timer.
+
+
+ tx + +
+ dictionary +
+
+ +
Configure OSPF LSA transmission timers.
+
+
+ delay + +
+ dictionary +
+
+ +
Configure OSPF LSA transmission delay.
+
+
+ initial + +
+ integer +
+
+ +
Delay to generate first occurrence of LSA in msecs.
+
+
+ max + +
+ integer +
+
+ +
Maximum delay between originating the same LSA in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min delay between originating the same LSA in msecs.
+
+
+ out_delay + +
+ integer +
+
+ +
Configure out-delay timer.
+
+
+ pacing + +
+ integer +
+
+ +
Configure OSPF packet pacing.
+
+
+ spf + +
+ dictionary +
+
+ +
Configure SPF timers
+
+
+ initial + +
+ integer +
+
+ +
Initial SPF schedule delay in msecs.
+
+
+ max + +
+ integer +
+
+ +
Max wait time between two SPFs in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min Hold time between two SPFs in msecs
+
+
+ seconds + +
+ integer +
+
+ +
Seconds.
+
+
+ throttle + +
+ dictionary +
+
+ +
Configure throttle timers(valid only for eos version < 4.23).
+
+
+ attr + +
+ string +
+
+ +
throttle attribute.
+
+
+ initial + +
+ integer +
+
+ +
Initial schedule delay in msecs.
+
+
+ max + +
+ integer +
+
+ +
Max wait time
+
+
+ min + +
+ integer +
+
+ +
Min Hold time
+
+
+ traffic_engineering + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enter traffic engineering config mode
+
+
+ vrf + +
+ string +
+
+ +
VRF name .
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ospf.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state: + # ------------ + # localhost#show running-config | section ospf + # localhost# + + - name: replace Ospf configs + arista.eos.eos_ospfv2: + config: + - processes: + - process_id: 1 + adjacency: + exchange_start: + threshold: 20045623 + areas: + - filter: + address: "10.1.1.0/24" + id: "0.0.0.2" + - id: "0.0.0.50" + range: + address: "172.20.0.0/16" + cost: 34 + default_information: + metric: 100 + metric_type: 1 + originate: True + distance: + intra_area: 85 + max_lsa: + count: 8000 + ignore_count: 3 + ignore_time: 6 + reset_time: 20 + threshold: 40 + networks: + - area: "0.0.0.0" + prefix: 10.10.2.0/24 + - area: "0.0.0.0" + prefix: "10.10.3.0/24" + redistribute: + - routes: "static" + router_id: "170.21.0.4" + - process_id: 2 + vrf: "vrf01" + areas: + - id: "0.0.0.9" + default_cost: 20 + max_lsa: + count: 8000 + ignore_count: 3 + ignore_time: 6 + reset_time: 20 + threshold: 40 + networks: + - area: "0.0.0.0" + prefix: 10.10.2.0/24 + - area: "0.0.0.0" + prefix: "10.10.3.0/24" + redistribute: + - routes: "static" + router_id: "170.21.0.4" + - process_id: 2 + vrf: "vrf01" + areas: + - id: "0.0.0.9" + default_cost: 20 + max_lsa: + count: 8000 + ignore_count: 3 + ignore_time: 6 + reset_time: 20 + threshold: 40 + - process_id: 3 + vrf: "vrf02" + redistribute: + - routes: "connected" + + # After state: + # localhost#show running-config | section ospf + # router ospf 1 + # router-id 170.21.0.4 + # distance ospf intra-area 85 + # redistribute static + # area 0.0.0.2 filter 10.1.1.0/24 + # area 0.0.0.50 range 172.20.0.0/16 cost 34 + # network 10.10.2.0/24 area 0.0.0.0 + # network 10.10.3.0/24 area 0.0.0.0 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # adjacency exchange-start threshold 20045623 + # default-information originate metric 100 metric-type 1 + # + # router ospf 2 vrf vrf01 + # area 0.0.0.9 default-cost 20 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # ! + # router ospf 3 vrf vrf02 + # redistribute connected + # max-lsa 12000 + # localhost# + # + # "processes": [ + # { + # "adjacency": { + # "exchange_start": { + # "threshold": 20045623 + # } + # }, + # "areas": [ + # { + # "filter": { + # "address": "10.1.1.0/24" + # }, + # "id": "0.0.0.2" + # }, + # { + # "id": "0.0.0.50", + # "range": { + # "address": "172.20.0.0/16", + # "cost": 34 + # } + # } + # ], + # "default_information": { + # "metric": 100, + # "metric_type": 1, + # "originate": true + # }, + # "distance": { + # "intra_area": 85 + # }, + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "networks": [ + # { + # "area": "0.0.0.0", + # "prefix": "10.10.2.0/24" + # }, + # { + # "area": "0.0.0.0", + # "prefix": "10.10.3.0/24" + # } + # ], + # "process_id": 1, + # "redistribute": [ + # { + # "routes": "static" + # } + # ], + # "router_id": "170.21.0.4" + # }, + # { + # "areas": [ + # { + # "default_cost": 20, + # "id": "0.0.0.9" + # } + # ], + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "process_id": 2, + # "vrf": "vrf01" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + # + + + # Using replaced: + # -------------- + + # Before State: + + # localhost#show running-config | section ospf + # router ospf 1 + # router-id 170.21.0.4 + # distance ospf intra-area 85 + # redistribute static + # area 0.0.0.2 filter 10.1.1.0/24 + # area 0.0.0.50 range 172.20.0.0/16 cost 34 + # network 10.10.2.0/24 area 0.0.0.0 + # network 10.10.3.0/24 area 0.0.0.0 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # adjacency exchange-start threshold 20045623 + # default-information originate metric 100 metric-type 1 + # ! + # router ospf 2 vrf vrf01 + # area 0.0.0.9 default-cost 20 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # ! + # router ospf 3 vrf vrf02 + # redistribute connected + # max-lsa 12000 + # localhost# + # + # "before": [ + # { + # "processes": [ + # { + # "adjacency": { + # "exchange_start": { + # "threshold": 20045623 + # } + # }, + # "areas": [ + # { + # "filter": { + # "address": "10.1.1.0/24" + # }, + # "id": "0.0.0.2" + # }, + # { + # "id": "0.0.0.50", + # "range": { + # "address": "172.20.0.0/16", + # "cost": 34 + # } + # } + # ], + # "default_information": { + # "metric": 100, + # "metric_type": 1, + # "originate": true + # }, + # "distance": { + # "intra_area": 85 + # }, + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "networks": [ + # { + # "area": "0.0.0.0", + # "prefix": "10.10.2.0/24" + # }, + # { + # "area": "0.0.0.0", + # "prefix": "10.10.3.0/24" + # } + # ], + # "process_id": 1, + # "redistribute": [ + # { + # "routes": "static" + # } + # ], + # "router_id": "170.21.0.4" + # }, + # { + # "areas": [ + # { + # "default_cost": 20, + # "id": "0.0.0.9" + # } + # ], + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "process_id": 2, + # "vrf": "vrf01" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + # + - name: replace Ospf configs + arista.eos.eos_ospfv2: + config: + - processes: + - process_id: 2 + vrf: "vrf01" + point_to_point: True + redistribute: + - routes: "isis" + isis_level: "level-1" + + state: replaced + + # After State: + # ----------- + # "router ospf 2 vrf vrf01", + # "no area 0.0.0.9 default-cost 20", + # "no max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20", + # "point-to-point routes", + # "redistribute isis level-1" + # + # "after": [ + # { + # "processes": [ + # { + # "adjacency": { + # "exchange_start": { + # "threshold": 20045623 + # } + # }, + # "areas": [ + # { + # "filter": { + # "address": "10.1.1.0/24" + # }, + # "id": "0.0.0.2" + # }, + # { + # "id": "0.0.0.50", + # "range": { + # "address": "172.20.0.0/16", + # "cost": 34 + # } + # } + # ], + # "default_information": { + # "metric": 100, + # "metric_type": 1, + # "originate": true + # }, + # "distance": { + # "intra_area": 85 + # }, + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "networks": [ + # { + # "area": "0.0.0.0", + # "prefix": "10.10.2.0/24" + # }, + # { + # "area": "0.0.0.0", + # "prefix": "10.10.3.0/24" + # } + # ], + # "process_id": 1, + # "redistribute": [ + # { + # "routes": "static" + # } + # ], + # "router_id": "170.21.0.4" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 2, + # "redistribute": [ + # { + # "isis_level": "level-1", + # "routes": "isis" + # } + # ], + # "vrf": "vrf01" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + # + + # Using overridden: + # ---------------- + + # Before State: + # localhost#show running-config | section ospf + # router ospf 1 + # router-id 170.21.0.4 + # distance ospf intra-area 85 + # redistribute static + # area 0.0.0.2 filter 10.1.1.0/24 + # area 0.0.0.50 range 172.20.0.0/16 cost 34 + # network 10.10.2.0/24 area 0.0.0.0 + # network 10.10.3.0/24 area 0.0.0.0 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # adjacency exchange-start threshold 20045623 + # default-information originate metric 100 metric-type 1 + # ! + # router ospf 2 vrf vrf01 + # redistribute isis level-1 + # max-lsa 12000 + # ! + # router ospf 3 vrf vrf02 + # redistribute connected + # max-lsa 12000 + # localhost# + # + # "before": [ + # { + # "processes": [ + # { + # "adjacency": { + # "exchange_start": { + # "threshold": 20045623 + # } + # }, + # "areas": [ + # { + # "filter": { + # "address": "10.1.1.0/24" + # }, + # "id": "0.0.0.2" + # }, + # { + # "id": "0.0.0.50", + # "range": { + # "address": "172.20.0.0/16", + # "cost": 34 + # } + # } + # ], + # "default_information": { + # "metric": 100, + # "metric_type": 1, + # "originate": true + # }, + # "distance": { + # "intra_area": 85 + # }, + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "networks": [ + # { + # "area": "0.0.0.0", + # "prefix": "10.10.2.0/24" + # }, + # { + # "area": "0.0.0.0", + # "prefix": "10.10.3.0/24" + # } + # ], + # "process_id": 1, + # "redistribute": [ + # { + # "routes": "static" + # } + # ], + # "router_id": "170.21.0.4" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 2, + # "redistribute": [ + # { + # "isis_level": "level-1", + # "routes": "isis" + # } + # ], + # "vrf": "vrf01" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + + - name: override Ospf configs + arista.eos.eos_ospfv2: + config: + - processes: + - process_id: 2 + vrf: "vrf01" + redistribute: + - routes: "connected" + + state: override + + # After State: + + # "no router ospf 1", + # "no router ospf 3", + # "router ospf 2 vrf vrf01", + # "no max-lsa 12000", + # "no redistribute isis level-1", + # "redistribute connected" + # + # "after": [ + # { + # "processes": [ + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 2, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf01" + # } + # ] + # } + # ] + + # Using Deleted: + + # localhost#show running-config | section ospf + # router ospf 1 + # router-id 170.21.0.4 + # distance ospf intra-area 85 + # redistribute static + # area 0.0.0.2 filter 10.1.1.0/24 + # area 0.0.0.50 range 172.20.0.0/16 cost 34 + # network 10.10.2.0/24 area 0.0.0.0 + # network 10.10.3.0/24 area 0.0.0.0 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # adjacency exchange-start threshold 20045623 + # default-information originate metric 100 metric-type 1 + # ! + # router ospf 2 vrf vrf01 + # redistribute connected + # area 0.0.0.9 default-cost 20 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # ! + # router ospf 3 vrf vrf02 + # redistribute connected + # max-lsa 12000 + # localhost# + # + # "before": [ + # { + # "processes": [ + # { + # "adjacency": { + # "exchange_start": { + # "threshold": 20045623 + # } + # }, + # "areas": [ + # { + # "filter": { + # "address": "10.1.1.0/24" + # }, + # "id": "0.0.0.2" + # }, + # { + # "id": "0.0.0.50", + # "range": { + # "address": "172.20.0.0/16", + # "cost": 34 + # } + # } + # ], + # "default_information": { + # "metric": 100, + # "metric_type": 1, + # "originate": true + # }, + # "distance": { + # "intra_area": 85 + # }, + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "networks": [ + # { + # "area": "0.0.0.0", + # "prefix": "10.10.2.0/24" + # }, + # { + # "area": "0.0.0.0", + # "prefix": "10.10.3.0/24" + # } + # ], + # "process_id": 1, + # "redistribute": [ + # { + # "routes": "static" + # } + # ], + # "router_id": "170.21.0.4" + # }, + # { + # "areas": [ + # { + # "default_cost": 20, + # "id": "0.0.0.9" + # } + # ], + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "process_id": 2, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf01" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + + - name: Delete Ospf configs + arista.eos.eos_ospfv2: + config: + - processes: + - process_id: 1 + + state: deleted + + # After State: + # Commands: + # "no router ospf 1" + + # "after": [ + # { + # "processes": [ + # { + # "areas": [ + # { + # "default_cost": 20, + # "id": "0.0.0.9" + # } + # ], + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "process_id": 2, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf01" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + + # Using gathered: + # localhost#show running-config | section ospf + # router ospf 2 vrf vrf01 + # redistribute connected + # area 0.0.0.9 default-cost 20 + # max-lsa 8000 40 ignore-time 6 ignore-count 3 reset-time 20 + # ! + # router ospf 3 vrf vrf02 + # redistribute connected + # max-lsa 12000 + # localhost# + + - name: replace Ospf configs + arista.eos.eos_ospfv2: + state: gathered + + # "gathered": [ + # { + # "processes": [ + # { + # "areas": [ + # { + # "default_cost": 20, + # "id": "0.0.0.9" + # } + # ], + # "max_lsa": { + # "count": 8000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "process_id": 2, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf01" + # }, + # { + # "max_lsa": { + # "count": 12000 + # }, + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + + # Using parsed: + # ------------ + + # parsed.cfg + # router ospf 1 + # adjacency exchange-start threshold 20045623 + # area 0.0.0.2 filter 10.1.1.0/24 + # area 0.0.0.50 range 172.20.0.0/16 cost 34 + # default-information originate metric 100 metric-type 1 + # distance ospf intra-area 85 + # max-lsa 80000 40 ignore-count 3 ignore-time 6 reset-time 20 + # network 10.10.2.0/24 area 0.0.0.0 + # network 10.10.3.0/24 area 0.0.0.0 + # redistribute static + # router-id 170.21.0.4 + # router ospf 2 vrf vrf01, + # area 0.0.0.9 default-cost 20 + # max-lsa 80000 40 ignore-count 3 ignore-time 6 reset-time 20 + # router ospf 3 vrf vrf02 + # redistribute static + + - name: Parse Ospf configs + arista.eos.eos_ospfv2: + running_config: "{{ lookup('file', './parsed.cfg') }}" + state: parsed + + # "parsed": [ + # { + # "processes": [ + # { + # "adjacency": { + # "exchange_start": { + # "threshold": 20045623 + # } + # }, + # "areas": [ + # { + # "filter": { + # "address": "10.1.1.0/24" + # }, + # "id": "0.0.0.2" + # }, + # { + # "id": "0.0.0.50", + # "range": { + # "address": "172.20.0.0/16", + # "cost": 34 + # } + # } + # ], + # "default_information": { + # "metric": 100, + # "metric_type": 1, + # "originate": true + # }, + # "distance": { + # "intra_area": 85 + # }, + # "max_lsa": { + # "count": 80000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "networks": [ + # { + # "area": "0.0.0.0", + # "prefix": "10.10.2.0/24" + # }, + # { + # "area": "0.0.0.0", + # "prefix": "10.10.3.0/24" + # } + # ], + # "process_id": 1, + # "redistribute": [ + # { + # "routes": "static" + # } + # ], + # "router_id": "170.21.0.4" + # }, + # { + # "areas": [ + # { + # "default_cost": 20, + # "id": "0.0.0.9" + # } + # ], + # "max_lsa": { + # "count": 80000, + # "ignore_count": 3, + # "ignore_time": 6, + # "reset_time": 20, + # "threshold": 40 + # }, + # "process_id": 2, + # "vrf": "vrf01," + # }, + # { + # "process_id": 3, + # "redistribute": [ + # { + # "routes": "static" + # } + # ], + # "vrf": "vrf02" + # } + # ] + # } + # ] + + # Using rendered: + # -------------- + + - name: replace Ospf configs + arista.eos.eos_ospfv2: + config: + - processes: + - process_id: 1 + adjacency: + exchange_start: + threshold: 20045623 + areas: + - filter: + address: 10.1.1.0/24 + id: 0.0.0.2 + - id: 0.0.0.50 + range: + address: 172.20.0.0/16 + cost: 34 + default_information: + metric: 100 + metric_type: 1 + originate: true + distance: + intra_area: 85 + max_lsa: + count: 8000 + ignore_count: 3 + ignore_time: 6 + reset_time: 20 + threshold: 40 + networks: + - area: 0.0.0.0 + prefix: 10.10.2.0/24 + - area: 0.0.0.0 + prefix: 10.10.3.0/24 + redistribute: + - routes: static + router_id: 170.21.0.4 + state: rendered + + # "rendered": [ + # "router ospf 1", + # "adjacency exchange-start threshold 20045623", + # "area 0.0.0.2 filter 10.1.1.0/24", + # "area 0.0.0.50 range 172.20.0.0/16 cost 34", + # "default-information originate metric 100 metric-type 1", + # "distance ospf intra-area 85", + # "max-lsa 8000 40 ignore-count 3 ignore-time 6 reset-time 20", + # "network 10.10.2.0/24 area 0.0.0.0", + # "network 10.10.3.0/24 area 0.0.0.0", + # "redistribute static", + # "router-id 170.21.0.4" + # ] + # + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The resulting configuration model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration prior to the model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['router ospf 1', 'adjacency exchange-start threshold 20045623', 'area 0.0.0.2 filter 10.1.1.0/24', 'area 0.0.0.50 range 172.20.0.0/16 cost 34', 'default-information originate metric 100 metric-type 1', 'distance ospf intra-area 85', 'max-lsa 8000 40 ignore-count 3 ignore-time 6 reset-time 20', 'network 10.10.2.0/24 area 0.0.0.0', 'network 10.10.3.0/24 area 0.0.0.0', 'redistribute static', 'router-id 170.21.0.4']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_ospfv3_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_ospfv3_module.rst new file mode 100644 index 000000000..76f0a7267 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_ospfv3_module.rst @@ -0,0 +1,4751 @@ +.. _arista.eos.eos_ospfv3_module: + + +********************* +arista.eos.eos_ospfv3 +********************* + +**OSPFv3 resource module** + + +Version added: 1.1.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of ospfv3 on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
A list of configurations for ospfv3.
+
+
+ processes + +
+ list + / elements=dictionary +
+
+ +
A list of dictionary specifying the ospfv3 processes.
+
+
+ address_family + +
+ list + / elements=dictionary +
+
+ +
Enable address family and enter its config mode
+
+
+ adjacency + +
+ dictionary +
+
+ +
Configure adjacency options for OSPF instance.
+
+
+ exchange_start + +
+ dictionary +
+
+ +
Configure exchange-start options for OSPF instance.
+
+
+ threshold + +
+ integer +
+
+ +
Number of peers to bring up simultaneously.
+
+
+ afi + +
+ string +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
address family .
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Specifies the configuration for OSPF areas
+
+
+ area_id + +
+ string +
+
+ +
Specifies a 32 bit number expressed in decimal or dotted-decimal notation.
+
+
+ authentication + +
+ dictionary +
+
+ +
Configure authentication for the area incase of ospfv3.
+
+
+ algorithm + +
+ string +
+
+
    Choices: +
  • md5
  • +
  • sha1
  • +
+
+
Name of algorithm to be used.
+
+
+ encrypt_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If False, key string is not encrypted
+
+
+ hidden_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Specifies that a HIDDEN key will follow.
+
+
+ key + +
+ string +
+
+ +
128 bit MD5 key or 140 bit SHA1 key.
+
+
+ passphrase + +
+ string +
+
+ +
Passphrase String for deriving keys for authentication and encryption.
+
+
+ spi + +
+ integer +
+
+ +
Specify the SPI value
+
+
+ default_cost + +
+ integer +
+
+ +
Specify the cost for default summary route in stub/NSSA area.
+
+
+ encryption + +
+ dictionary +
+
+ +
Configure encryption for the area
+
+
+ algorithm + +
+ string +
+
+
    Choices: +
  • sha1
  • +
  • md5
  • +
+
+
name of the algorithm to be used.
+
+
+ encrypt_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If False, key string is not encrypted
+
+
+ encryption + +
+ string +
+
+
    Choices: +
  • 3des-cbc
  • +
  • aes-128-cbc
  • +
  • aes-192-cbc
  • +
  • aes-256-cbc
  • +
  • null
  • +
+
+
name of encryption to be used.
+
+
+ hidden_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Specifies that a HIDDEN key will follow.
+
+
+ key + +
+ string +
+
+ +
128 bit MD5 key or 140 bit SHA1 key.
+
+
+ passphrase + +
+ string +
+
+ +
Passphrase String for deriving keys for authentication and encryption.
+
+
+ spi + +
+ integer +
+
+ +
Specify the SPI value
+
+
+ nssa + +
+ dictionary +
+
+ +
Configures NSSA parameters.
+
+
+ default_information_originate + +
+ dictionary +
+
+ +
Originate default Type 7 LSA.
+
+
+ metric + +
+ integer +
+
+ +
Metric for default route.
+
+
+ metric_type + +
+ integer +
+
+ +
Metric type for default route.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Limit default advertisement to this NSSA area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
True if only default information orignate is set
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Filter all type-3 LSAs in the nssa area.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable Type-7 LSA p-bit setting
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
True if only nssa is set
+
+
+ translate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable LSA translation.
+
+
+ ranges + +
+ list + / elements=dictionary +
+
+ +
Configure route summarization.
+
+
+ address + +
+ string +
+
+ +
IP address.
+
+
+ advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable Advertisement of the range.
+
+
+ cost + +
+ integer +
+
+ +
Configures the metric.
+
+
+ subnet_address + +
+ string +
+
+ +
IP address with mask length
+
+
+ subnet_mask + +
+ string +
+
+ +
IP subnet mask
+
+
+ stub + +
+ dictionary +
+
+ +
Stub area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
True if only stub is set
+
+
+ summary_lsa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If False , Filter all type-3 LSAs in the stub area.
+
+
+ auto_cost + +
+ dictionary +
+
+ +
Set auto-cost.
+
+
+ reference_bandwidth + +
+ integer +
+
+ +
reference bandwidth in megabits per sec.
+
+
+ bfd + +
+ dictionary +
+
+ +
Enable BFD.
+
+
+ all_interfaces + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BFD on all interfaces.
+
+
+ default_information + +
+ dictionary +
+
+ +
Control distribution of default information.
+
+
+ always + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Always advertise default route.
+
+
+ metric + +
+ integer +
+
+ +
Metric for default route.
+
+
+ metric_type + +
+ integer +
+
+ +
Metric type for default route.
+
+
+ originate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Distribute a default route.
+
+
+ route_map + +
+ string +
+
+ +
Specify which route-map to use.
+
+
+ default_metric + +
+ integer +
+
+ +
Configure the default metric for redistributed routes.
+
+
+ distance + +
+ integer +
+
+ +
Specifies the administrative distance for routes.
+
+
+ fips_restrictions + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use FIPS compliant algorithms
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Enable graceful restart mode.
+
+
+ grace_period + +
+ integer +
+
+ +
Specify maximum time to wait for graceful-restart to complete.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true sets the grace_fulrestart config alone.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Enable graceful restart helper.
+
+
+ log_adjacency_changes + +
+ dictionary +
+
+ +
To configure link-state changes and transitions of OSPFv3 neighbors.
+
+
+ detail + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If true , configures the switch to log all link-state changes.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true sets the log_adjacency_changes config alone.
+
+
+ max_metric + +
+ dictionary +
+
+ +
Set maximum metric.
+
+
+ router_lsa + +
+ dictionary +
+
+ +
Maximum metric in self-originated router-LSAs.
+
+
+ external_lsa + +
+ dictionary +
+
+ +
Override external-lsa metric with max-metric value.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ include_stub + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set maximum metric for stub links in router-LSAs.
+
+
+ on_startup + +
+ dictionary +
+
+ +
Set maximum metric temporarily after reboot.
+
+
+ wait_for_bgp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Let BGP decide when to originate router-LSA with normal metric
+
+
+ wait_period + +
+ integer +
+
+ +
Wait period in seconds after startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set router-lsa attribute.
+
+
+ summary_lsa + +
+ dictionary +
+
+ +
Override summary-lsa metric with max-metric value.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ maximum_paths + +
+ integer +
+
+ +
Maximum number of next-hops in an ECMP route.
+
+
+ passive_interface + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Include interface but without actively running OSPF.
+
+
+ redistribute + +
+ list + / elements=dictionary +
+
+ +
Specifies the routes to be redistributed.
+
+
+ route_map + +
+ string +
+
+ +
Specify which route map to use.
+
+
+ routes + +
+ string +
+
+
    Choices: +
  • bgp
  • +
  • connected
  • +
  • static
  • +
+
+
Route types (BGP,static,connected)
+
+
+ router_id + +
+ string +
+
+ +
32-bit number assigned to a router running OSPFv3.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable the OSPF instance.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure OSPF timers.
+
+
+ lsa + +
+ raw +
+
+ +
Configure OSPFv3 LSA timers.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • rx
  • +
  • tx
  • +
+
+
Configure OSPFv3 LSA receiving/transmission timers.
+
+
+ initial + +
+ integer +
+
+ +
Initial SPF schedule delay in msecs.
+
+
+ max + +
+ integer +
+
+ +
Max wait time between two SPFs in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min Hold time between two SPFs in msecs
+
+
+ out_delay + +
+ integer +
+
+ +
Configure out-delay timer.
+
+
+ pacing + +
+ integer +
+
+ +
Configure OSPF packet pacing.
+
+
+ spf + +
+ dictionary +
+
+ +
Configure OSPFv3 spf timers.
+
+
+ initial + +
+ integer +
+
+ +
Initial SPF schedule delay in msecs.
+
+
+ max + +
+ integer +
+
+ +
Max wait time between two SPFs in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min Hold time between two SPFs in msecs
+
+
+ throttle + +
+ dictionary +
+
+ +
This command is deprecated by 'timers lsa' or 'timers spf'.
+
+
+ initial + +
+ integer +
+
+ +
Initial SPF schedule delay in msecs.
+
+
+ lsa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure threshold for retransmission of lsa
+
+
+ max + +
+ integer +
+
+ +
Max wait time between two SPFs in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min Hold time between two SPFs in msecs
+
+
+ spf + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure time between SPF calculations
+
+
+ adjacency + +
+ dictionary +
+
+ +
Configure adjacency options for OSPF instance.
+
+
+ exchange_start + +
+ dictionary +
+
+ +
Configure exchange-start options for OSPF instance.
+
+
+ threshold + +
+ integer +
+
+ +
Number of peers to bring up simultaneously.
+
+
+ areas + +
+ list + / elements=dictionary +
+
+ +
Specifies the configuration for OSPF areas
+
+
+ area_id + +
+ string +
+
+ +
Specifies a 32 bit number expressed in decimal or dotted-decimal notation.
+
+
+ authentication + +
+ dictionary +
+
+ +
Configure authentication for the area incase of ospfv3.
+
+
+ algorithm + +
+ string +
+
+
    Choices: +
  • md5
  • +
  • sha1
  • +
+
+
Name of algorithm to be used.
+
+
+ encrypt_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If False, key string is not encrypted
+
+
+ hidden_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Specifies that a HIDDEN key will follow.
+
+
+ key + +
+ string +
+
+ +
128 bit MD5 key or 140 bit SHA1 key.
+
+
+ passphrase + +
+ string +
+
+ +
Passphrase String for deriving keys for authentication and encryption.
+
+
+ spi + +
+ integer +
+
+ +
Specify the SPI value
+
+
+ default_cost + +
+ integer +
+
+ +
Specify the cost for default summary route in stub/NSSA area.
+
+
+ encryption + +
+ dictionary +
+
+ +
Configure encryption for the area
+
+
+ algorithm + +
+ string +
+
+
    Choices: +
  • sha1
  • +
  • md5
  • +
+
+
name of the algorithm to be used.
+
+
+ encrypt_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If False, key string is not encrypted
+
+
+ encryption + +
+ string +
+
+
    Choices: +
  • 3des-cbc
  • +
  • aes-128-cbc
  • +
  • aes-192-cbc
  • +
  • aes-256-cbc
  • +
  • null
  • +
+
+
name of encryption to be used.
+
+
+ hidden_key + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Specifies that a HIDDEN key will follow.
+
+
+ key + +
+ string +
+
+ +
128 bit MD5 key or 140 bit SHA1 key.
+
+
+ passphrase + +
+ string +
+
+ +
Passphrase String for deriving keys for authentication and encryption.
+
+
+ spi + +
+ integer +
+
+ +
Specify the SPI value
+
+
+ nssa + +
+ dictionary +
+
+ +
Configures NSSA parameters.
+
+
+ default_information_originate + +
+ dictionary +
+
+ +
Originate default Type 7 LSA.
+
+
+ metric + +
+ integer +
+
+ +
Metric for default route.
+
+
+ metric_type + +
+ integer +
+
+ +
Metric type for default route.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Limit default advertisement to this NSSA area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
True if only default information orignate is set
+
+
+ no_summary + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Filter all type-3 LSAs in the nssa area.
+
+
+ nssa_only + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable Type-7 LSA p-bit setting
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
True if only nssa is set
+
+
+ translate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable LSA translation.
+
+
+ stub + +
+ dictionary +
+
+ +
Stub area.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
True if only stub is set.
+
+
+ summary_lsa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If False , Filter all type-3 LSAs in the stub area.
+
+
+ auto_cost + +
+ dictionary +
+
+ +
Set auto-cost.
+
+
+ reference_bandwidth + +
+ integer +
+
+ +
reference bandwidth in megabits per sec.
+
+
+ bfd + +
+ dictionary +
+
+ +
Enable BFD.
+
+
+ all_interfaces + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable BFD on all interfaces.
+
+
+ fips_restrictions + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use FIPS compliant algorithms
+
+
+ graceful_restart + +
+ dictionary +
+
+ +
Enable graceful restart mode.
+
+
+ grace_period + +
+ integer +
+
+ +
Specify maximum time to wait for graceful-restart to complete.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true sets the grace_fulrestart config alone.
+
+
+ graceful_restart_helper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If True, Enable graceful restart helper.
+
+
+ log_adjacency_changes + +
+ dictionary +
+
+ +
To configure link-state changes and transitions of OSPFv3 neighbors.
+
+
+ detail + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
If true , configures the switch to log all link-state changes.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
When true sets the log_adjacency_changes config alone.
+
+
+ max_metric + +
+ dictionary +
+
+ +
Set maximum metric.
+
+
+ router_lsa + +
+ dictionary +
+
+ +
Maximum metric in self-originated router-LSAs.
+
+
+ external_lsa + +
+ dictionary +
+
+ +
Override external-lsa metric with max-metric value.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ include_stub + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set maximum metric for stub links in router-LSAs.
+
+
+ on_startup + +
+ dictionary +
+
+ +
Set maximum metric temporarily after reboot.
+
+
+ wait_for_bgp + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Let BGP decide when to originate router-LSA with normal metric
+
+
+ wait_period + +
+ integer +
+
+ +
Wait period in seconds after startup.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set router-lsa attribute.
+
+
+ summary_lsa + +
+ dictionary +
+
+ +
Override summary-lsa metric with max-metric value.
+
+
+ max_metric_value + +
+ integer +
+
+ +
Set max metric value for external LSAs.
+
+
+ set + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set external-lsa attribute.
+
+
+ passive_interface + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Include interface but without actively running OSPF.
+
+
+ router_id + +
+ string +
+
+ +
32-bit number assigned to a router running OSPFv3.
+
+
+ shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Disable the OSPF instance.
+
+
+ timers + +
+ dictionary +
+
+ +
Configure OSPF timers.
+
+
+ lsa + +
+ raw +
+
+ +
Configure OSPFv3 LSA timers.
+
+
+ direction + +
+ string +
+
+
    Choices: +
  • rx
  • +
  • tx
  • +
+
+
Configure OSPFv3 LSA receiving/transmission timers.
+
+
+ initial + +
+ integer +
+
+ +
Initial SPF schedule delay in msecs.
+
+
+ max + +
+ integer +
+
+ +
Max wait time between two SPFs in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min Hold time between two SPFs in msecs
+
+
+ out_delay + +
+ integer +
+
+ +
Configure out-delay timer.
+
+
+ pacing + +
+ integer +
+
+ +
Configure OSPF packet pacing.
+
+
+ spf + +
+ dictionary +
+
+ +
Configure OSPFv3 spf timers.
+
+
+ initial + +
+ integer +
+
+ +
Initial SPF schedule delay in msecs.
+
+
+ max + +
+ integer +
+
+ +
Max wait time between two SPFs in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min Hold time between two SPFs in msecs
+
+
+ throttle + +
+ dictionary +
+
+ +
This command is deprecated by 'timers lsa' or 'timers spf'.
+
+
+ initial + +
+ integer +
+
+ +
Initial SPF schedule delay in msecs.
+
+
+ lsa + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure threshold for retransmission of lsa
+
+
+ max + +
+ integer +
+
+ +
Max wait time between two SPFs in msecs.
+
+
+ min + +
+ integer +
+
+ +
Min Hold time between two SPFs in msecs
+
+
+ spf + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure time between SPF calculations
+
+
+ vrf + +
+ string +
+
+ +
VRF name .
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section ospfv3.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + + # Before state + + # veos#show running-config | section ospfv3 + # veos# + + + - arista.eos.eos_ospfv3: + config: + processes: + - address_family: + - timers: + lsa: 22 + graceful_restart: + grace_period: 35 + afi: "ipv6" + timers: + pacing: 55 + fips_restrictions: True + router_id: "2.2.2.2" + vrf: "vrfmerge" + + + # After state + + # veos#show running-config | section ospfv3 + # router ospfv3 vrf vrfmerge + # router-id 2.2.2.2 + # test + # fips restrictions + # timers pacing flood 55 + # ! + # address-family ipv6 + # fips restrictions + # timers lsa arrival 22 + # graceful-restart grace-period 35 + # veos# + + # Module Execution + # "after": { + # "processes": [ + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "fips_restrictions": true, + # "graceful_restart": { + # "grace_period": 35 + # }, + # "timers": { + # "lsa": 22 + # } + # } + # ], + # "fips_restrictions": true, + # "router_id": "2.2.2.2", + # "timers": { + # "pacing": 55 + # }, + # "vrf": "vrfmerge" + # } + # ] + # }, + # "before": {}, + # "changed": true, + # "commands": [ + # "router ospfv3 vrf vrfmerge", + # "address-family ipv6", + # "graceful-restart grace-period 35", + # "timers lsa arrival 22", + # "exit", + # "timers pacing flood 55", + # "fips restrictions", + # "router-id 2.2.2.2", + # "exit" + # ], + + + # using replaced + + # before state + + # veos#show running-config | section ospfv3 + # router ospfv3 + # fips restrictions + # area 0.0.0.0 encryption ipsec spi 43 esp null md5 passphrase 7 h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4= + # ! + # router ospfv3 vrf vrfmerge + # router-id 2.2.2.2 + # fips restrictions + # timers pacing flood 55 + # ! + # address-family ipv6 + # fips restrictions + # timers lsa arrival 22 + # graceful-restart grace-period 35 + # veos# + + + - arista.eos.eos_ospfv3: + config: + processes: + - areas: + - area_id: "0.0.0.0" + encryption: + spi: 43 + encryption: "null" + algorithm: "md5" + encrypt_key: False + passphrase: "7hl8FV3lZ6H1mAKpjL47hQ==" + vrf: "default" + address_family: + - afi: "ipv4" + router_id: "7.1.1.1" + state: replaced + + # After state + # veos#show running-config | section ospfv3 + # router ospfv3 + # area 0.0.0.0 encryption ipsec spi 43 esp null md5 passphrase 7 h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4= + # ! + # router ospfv3 vrf vrfmerge + # passive-interface default + # ! + # address-family ipv6 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # veos# + + # Module execution + + # "after": { + # "processes": [ + # { + # "areas": [ + # { + # "area_id": "0.0.0.0", + # "encryption": { + # "algorithm": "md5", + # "encryption": "null", + # "hidden_key": true, + # "passphrase": "h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4=" + # } + # } + # ], + # "vrf": "default" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ] + # } + # ], + # "passive_interface": true, + # "vrf": "vrfmerge" + # } + # ] + # }, + # "before": { + # "processes": [ + # { + # "areas": [ + # { + # "area_id": "0.0.0.0", + # "encryption": { + # "algorithm": "md5", + # "encryption": "null", + # "hidden_key": true, + # "passphrase": "h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4=" + # } + # } + # ], + # "fips_restrictions": true, + # "vrf": "default" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "fips_restrictions": true, + # "graceful_restart": { + # "grace_period": 35 + # }, + # "timers": { + # "lsa": 22 + # } + # } + # ], + # "fips_restrictions": true, + # "router_id": "2.2.2.2", + # "timers": { + # "pacing": 55 + # }, + # "vrf": "vrfmerge" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "router ospfv3 vrf vrfmerge", + # "address-family ipv6", + # "no fips restrictions", + # "no graceful-restart", + # "no timers lsa arrival 22", + # "area 0.0.0.3 range 10.1.2.2/24 advertise", + # "area 0.0.0.3 range 60.1.1.1 255.255.0.0 cost 30", + # "exit", + # "passive-interface default", + # "no router-id", + # "no fips restrictions", + # "no timers pacing flood 55", + # "exit" + # ], + + + # using overridden + + # before state + + # veos#show running-config | section ospfv3 + # router ospfv3 + # area 0.0.0.0 encryption ipsec spi 43 esp null md5 passphrase 7 h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4= + # ! + # router ospfv3 vrf vrfmerge + # passive-interface default + # ! + # address-family ipv6 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # veos# + + + - arista.eos.eos_ospfv3: + config: + processes: + - address_family: + - areas: + - area_id: "0.0.0.3" + ranges: + - address: 10.1.2.2/24 + advertise: True + - address: 60.1.1.1 + subnet_mask: 255.255.0.0 + cost: 30 + afi: "ipv6" + passive_interface: True + vrf: "vrfmerge" + state: overridden + + # After state + + # veos#show running-config | section ospfv3 + # router ospfv3 vrf vrfmerge + # passive-interface default + # ! + # address-family ipv6 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # veos# + + + + # Module execution + + # "after": { + # "processes": [ + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ] + # } + # ], + # "passive_interface": true, + # "vrf": "vrfmerge" + # } + # ] + # }, + # "before": { + # "processes": [ + # { + # "areas": [ + # { + # "area_id": "0.0.0.0", + # "encryption": { + # "algorithm": "md5", + # "encryption": "null", + # "hidden_key": true, + # "passphrase": "h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4=" + # } + # } + # ], + # "vrf": "default" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ] + # } + # ], + # "passive_interface": true, + # "vrf": "vrfmerge" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "no router ospfv3", + # "router ospfv3 vrf vrfmerge", + # "address-family ipv6", + # "no area 0.0.0.3 range 10.1.2.0/24", + # "no area 0.0.0.3 range 60.1.0.0/16 cost 30", + # "area 0.0.0.3 range 10.1.2.2/24 advertise", + # "area 0.0.0.3 range 60.1.1.1 255.255.0.0 cost 30", + # "exit", + # "exit" + # ], + + # using deleted + + # Before state + + # veos#show running-config | section ospfv3 + # router ospfv3 + # area 0.0.0.0 encryption ipsec spi 43 esp null md5 passphrase 7 h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4= + # ! + # router ospfv3 vrf vrfmerge + # passive-interface default + # ! + # address-family ipv4 + # redistribute connected + # redistribute static route-map MAP01 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # ! + # address-family ipv6 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # veos# + + + - arista.eos.eos_ospfv3: + config: + processes: + - vrf: "default" + state: deleted + + # After state + + # veos#show running-config | section ospfv3 + # router ospfv3 vrf vrfmerge + # passive-interface default + # ! + # address-family ipv4 + # redistribute connected + # redistribute static route-map MAP01 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # ! + # address-family ipv6 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # veos# + + + # Module execution + # "after": { + # "processes": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ], + # "redistribute": [ + # { + # "routes": "connected" + # }, + # { + # "route_map": "MAP01", + # "routes": "static" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ] + # } + # ], + # "passive_interface": true, + # "vrf": "vrfmerge" + # } + # ] + # }, + # "before": { + # "processes": [ + # { + # "areas": [ + # { + # "area_id": "0.0.0.0", + # "encryption": { + # "algorithm": "md5", + # "encryption": "null", + # "hidden_key": true, + # "passphrase": "h8pZp9eprTYjjoY/NKFFe0Ei7x03Y7dyLotRhI0a5t4=" + # } + # } + # ], + # "vrf": "default" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ], + # "redistribute": [ + # { + # "routes": "connected" + # }, + # { + # "route_map": "MAP01", + # "routes": "static" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ] + # } + # ], + # "passive_interface": true, + # "vrf": "vrfmerge" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "no router ospfv3" + # ], + + # using parsed + + # parsed_ospfv3.cfg + + # router ospfv3 + # fips restrictions + # area 0.0.0.20 stub + # area 0.0.0.20 authentication ipsec spi 33 sha1 passphrase 7 4O8T3zo4xBdRWXBnsnK934o9SEb+jEhHUN6+xzZgCo2j9EnQBUvtwNxxLEmYmm6w + # area 0.0.0.40 default-cost 45 + # area 0.0.0.40 stub + # timers pacing flood 7 + # adjacency exchange-start threshold 11 + # ! + # address-family ipv4 + # fips restrictions + # redistribute connected + # ! + # address-family ipv6 + # router-id 10.1.1.1 + # fips restrictions + # ! + # router ospfv3 vrf vrf01 + # bfd all-interfaces + # fips restrictions + # area 0.0.0.0 encryption ipsec spi 256 esp null sha1 passphrase 7 7hl8FV3lZ6H1mAKpjL47hQ== + # log-adjacency-changes detail + # ! + # address-family ipv4 + # passive-interface default + # fips restrictions + # redistribute connected route-map MAP01 + # maximum-paths 100 + # ! + # address-family ipv6 + # fips restrictions + # area 0.0.0.10 nssa no-summary + # default-information originate route-map DefaultRouteFilter + # max-metric router-lsa external-lsa 25 summary-lsa + # ! + # router ospfv3 vrf vrf02 + # fips restrictions + # ! + # address-family ipv6 + # router-id 10.17.0.3 + # distance ospf intra-area 200 + # fips restrictions + # area 0.0.0.1 stub + # timers spf delay initial 56 56 56 + # timers out-delay 10 + + + - arista.eos.eos_ospfv3: + running_config: "{{ lookup('file', './parsed_ospfv3.cfg') }}" + state: parsed + + # Module execution + + # "parsed": { + # "processes": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "fips_restrictions": true, + # "redistribute": [ + # { + # "routes": "connected" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "fips_restrictions": true, + # "router_id": "10.1.1.1" + # } + # ], + # "adjacency": { + # "exchange_start": { + # "threshold": 11 + # } + # }, + # "areas": [ + # { + # "area_id": "0.0.0.20", + # "authentication": { + # "algorithm": "sha1", + # "hidden_key": true, + # "passphrase": "4O8T3zo4xBdRWXBnsnK934o9SEb+jEhHUN6+xzZgCo2j9EnQBUvtwNxxLEmYmm6w", + # "spi": 33 + # }, + # "stub": { + # "set": true + # } + # }, + # { + # "area_id": "0.0.0.40", + # "default_cost": 45, + # "stub": { + # "set": true + # } + # } + # ], + # "fips_restrictions": true, + # "timers": { + # "pacing": 7 + # }, + # "vrf": "default" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "fips_restrictions": true, + # "maximum_paths": 100, + # "passive_interface": true, + # "redistribute": [ + # { + # "route_map": "MAP01", + # "routes": "connected" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.10", + # "nssa": { + # "no_summary": true + # } + # } + # ], + # "default_information": { + # "originate": true, + # "route_map": "DefaultRouteFilter" + # }, + # "fips_restrictions": true, + # "max_metric": { + # "router_lsa": { + # "external_lsa": { + # "max_metric_value": 25 + # }, + # "summary_lsa": { + # "set": true + # } + # } + # } + # } + # ], + # "areas": [ + # { + # "area_id": "0.0.0.0", + # "encryption": { + # "algorithm": "sha1", + # "encryption": "null", + # "hidden_key": true, + # "passphrase": "7hl8FV3lZ6H1mAKpjL47hQ==" + # } + # } + # ], + # "bfd": { + # "all_interfaces": true + # }, + # "fips_restrictions": true, + # "log_adjacency_changes": { + # "detail": true + # }, + # "vrf": "vrf01" + # }, + # { + # "address_family": [ + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.1", + # "stub": { + # "set": true + # } + # } + # ], + # "distance": 200, + # "fips_restrictions": true, + # "router_id": "10.17.0.3", + # "timers": { + # "out_delay": 10, + # "spf": { + # "initial": 56, + # "max": 56, + # "min": 56, + # } + # } + # } + # ], + # "fips_restrictions": true, + # "vrf": "vrf02" + # } + # ] + + # using gathered + + # native config + + # veos#show running-config | section ospfv3 + # router ospfv3 vrf vrfmerge + # passive-interface default + # ! + # address-family ipv4 + # redistribute connected + # redistribute static route-map MAP01 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # ! + # address-family ipv6 + # area 0.0.0.3 range 10.1.2.0/24 + # area 0.0.0.3 range 60.1.0.0/16 cost 30 + # veos# + + + - arista.eos.eos_ospfv3: + state: gathered + + # module execution + + # "gathered": { + # "processes": [ + # { + # "address_family": [ + # { + # "afi": "ipv4", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ], + # "redistribute": [ + # { + # "routes": "connected" + # }, + # { + # "route_map": "MAP01", + # "routes": "static" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "areas": [ + # { + # "area_id": "0.0.0.3", + # "ranges": [ + # { + # "address": "10.1.2.0/24" + # }, + # { + # "address": "60.1.0.0/16", + # "cost": 30 + # } + # ] + # } + # ] + # } + # ], + # "passive_interface": true, + # "vrf": "vrfmerge" + # } + # ] + + # using rendered + + - arista.eos.eos_ospfv3: + config: + processes: + - address_family: + - timers: + lsa: 22 + graceful_restart: + grace_period: 35 + afi: "ipv6" + timers: + pacing: 55 + fips_restrictions: True + router_id: "2.2.2.2" + vrf: "vrfmerge" + state: rendered + + # module execution + + # "rendered": [ + # "router ospfv3 vrf vrfmerge", + # "address-family ipv6", + # "graceful-restart grace-period 35", + # "timers lsa arrival 22", + # "exit", + # "timers pacing flood 55", + # "fips restrictions", + # "router-id 2.2.2.2", + # "exit" + # ] + + + + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_prefix_lists_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_prefix_lists_module.rst new file mode 100644 index 000000000..7f2474438 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_prefix_lists_module.rst @@ -0,0 +1,1445 @@ +.. _arista.eos.eos_prefix_lists_module: + + +*************************** +arista.eos.eos_prefix_lists +*************************** + +**Manages Prefix lists resource module** + + +Version added: 2.2.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of Prefix lists on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of dictionary of prefix-list options
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
The Address Family Indicator (AFI) for the prefix list.
+
+
+ prefix_lists + +
+ list + / elements=dictionary +
+
+ +
A list of prefix-lists.
+
+
+ entries + +
+ list + / elements=dictionary +
+
+ +
List of prefix-lists
+
+
+ action + +
+ string +
+
+
    Choices: +
  • deny
  • +
  • permit
  • +
+
+
action to be performed on the specified path
+
+
+ address + +
+ string +
+
+ +
ipv4/v6 address in prefix-mask or address-masklen format
+
+
+ match + +
+ dictionary +
+
+ +
match masklen
+
+
+ masklen + +
+ integer +
+
+ +
Mask Length.
+
+
+ operator + +
+ string +
+
+
    Choices: +
  • eq
  • +
  • le
  • +
  • ge
  • +
+
+
equalto/greater than/lesser than
+
+
+ resequence + +
+ dictionary +
+
+ +
Resequence the list.
+
+
+ default + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Resequence with default values (10).
+
+
+ start_seq + +
+ integer +
+
+ +
Starting sequence number.
+
+
+ step + +
+ integer +
+
+ +
Step to increment the sequence number.
+
+
+ sequence + +
+ integer +
+
+ +
sequence number
+
+
+ name + +
+ string + / required +
+
+ +
Name of the prefix-list
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section access-list.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + # Before state + # veos#show running-config | section prefix-lists + # veos# + + - name: Merge provided configuration with device configuration + arista.eos.eos_prefix_lists: + config: + - afi: "ipv4" + prefix_lists: + - name: "v401" + entries: + - sequence: 25 + action: "deny" + address: "45.55.4.0/24" + - sequence: 100 + action: "permit" + address: "11.11.2.0/24" + match: + masklen: 32 + operator: "ge" + - name: "v402" + entries: + - action: "deny" + address: "10.1.1.0/24" + sequence: 10 + match: + masklen: 32 + operator: "ge" + - afi: "ipv6" + prefix_lists: + - name: "v601" + entries: + - sequence: 125 + action: "deny" + address: "5000:1::/64" + + # After State + # veos# + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 + # seq 100 permit 11.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # veos# + # + # Module Execution: + # "after": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 10 + # } + # ], + # "name": "v402" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ], + # "before": {}, + # "changed": true, + # "commands": [ + # "ipv6 prefix-list v601", + # "seq 125 deny 5000:1::/64", + # "ip prefix-list v401", + # "seq 25 deny 45.55.4.0/24", + # "seq 100 permit 11.11.2.0/24 ge 32", + # "ip prefix-list v402", + # "seq 10 deny 10.1.1.0/24 ge 32" + # ], + # + + # using merged: + # Failure scenario : 'merged' should not be used when an existing prefix-list (sequence number) + # is to be modified. + + # Before State: + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 + # seq 100 permit 11.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # veos# + + - name: Merge provided configuration with device configuration + arista.eos.eos_prefix_lists: + config: + - afi: "ipv4" + prefix_lists: + - name: "v401" + entries: + - sequence: 25 + action: "deny" + address: "45.55.4.0/24" + match: + masklen: 32 + operator: "ge" + - sequence: 100 + action: "permit" + address: "11.11.2.0/24" + match: + masklen: 32 + operator: "ge" + - name: "v402" + entries: + - action: "deny" + address: "10.1.1.0/24" + sequence: 10 + match: + masklen: 32 + operator: "ge" + - afi: "ipv6" + prefix_lists: + - name: "v601" + entries: + - sequence: 125 + action: "deny" + address: "5000:1::/64" + state: merged + + # Module Execution: + # fatal: [192.168.122.113]: FAILED! => { + # "changed": false, + # "invocation": { + # "module_args": { + # "config": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "resequence": null, + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "resequence": null, + # "sequence": 100 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "resequence": null, + # "sequence": 10 + # } + # ], + # "name": "v402" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "match": null, + # "resequence": null, + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ], + # "running_config": null, + # "state": "merged" + # } + # }, + # "msg": "Sequence number 25 is already present. Use replaced/overridden operation to change the configuration" + # } + # + + # Using Replaced: + + # Before state: + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 + # seq 100 permit 11.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # veos# + - name: Replace + arista.eos.eos_prefix_lists: + config: + - afi: "ipv4" + prefix_lists: + - name: "v401" + entries: + - sequence: 25 + action: "deny" + address: "45.55.4.0/24" + match: + masklen: 32 + operator: "ge" + - sequence: 200 + action: "permit" + address: "200.11.2.0/24" + match: + masklen: 32 + operator: "ge" + state: replaced + # After State: + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 ge 32 + # seq 200 permit 200.11.2.0/24 ge 32 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # veos# + # + # + # Module Execution: + # + # "after": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "200.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 200 + # } + # ], + # "name": "v401" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ], + # "before": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 10 + # } + # ], + # "name": "v402" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ], + # "changed": true, + # "commands": [ + # "ip prefix-list v401", + # "no seq 25", + # "seq 25 deny 45.55.4.0/24 ge 32", + # "seq 200 permit 200.11.2.0/24 ge 32", + # "no seq 100", + # "no ip prefix-list v402" + # ], + + # Using overridden: + # Before State: + + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 ge 32 + # seq 100 permit 11.11.2.0/24 ge 32 + # seq 200 permit 200.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # veos# + + + - name: Override + arista.eos.eos_prefix_lists: + config: + - afi: "ipv4" + prefix_lists: + - name: "v401" + entries: + - sequence: 25 + action: "deny" + address: "45.55.4.0/24" + - sequence: 300 + action: "permit" + address: "30.11.2.0/24" + match: + masklen: 32 + operator: "ge" + - name: "v403" + entries: + - action: "deny" + address: "10.1.1.0/24" + sequence: 10 + state: overridden + + # After State + # veos# + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 ge 32 + # seq 300 permit 30.11.2.0/24 ge 32 + # ! + # ip prefix-list v403 + # seq 10 deny 10.1.1.0/24 + # veos# + # + # + # Module Execution: + # "after": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "30.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 300 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "sequence": 10 + # } + # ], + # "name": "v403" + # } + # ] + # } + # ], + # "before": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # }, + # { + # "action": "permit", + # "address": "200.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 200 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 10 + # } + # ], + # "name": "v402" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ], + # "changed": true, + # "commands": [ + # "no ipv6 prefix-list v601", + # "ip prefix-list v401", + # "seq 25 deny 45.55.4.0/24", + # "seq 300 permit 30.11.2.0/24 ge 32", + # "no seq 100", + # "no seq 200", + # "ip prefix-list v403", + # "seq 10 deny 10.1.1.0/24", + # "no ip prefix-list v402" + # ], + # + + # Using deleted: + # Before State: + + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 ge 32 + # seq 100 permit 11.11.2.0/24 ge 32 + # seq 300 permit 30.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ip prefix-list v403 + # seq 10 deny 10.1.1.0/24 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # veos# + + - name: Delete device configuration + arista.eos.eos_prefix_lists: + config: + - afi: "ipv6" + state: deleted + + + # after State: + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 ge 32 + # seq 100 permit 11.11.2.0/24 ge 32 + # seq 300 permit 30.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ip prefix-list v403 + # seq 10 deny 10.1.1.0/24 + # + # + # Module Execution: + # "after": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # }, + # { + # "action": "permit", + # "address": "30.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 300 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 10 + # } + # ], + # "name": "v402" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "sequence": 10 + # } + # ], + # "name": "v403" + # } + # ] + # } + # ], + # "before": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # }, + # { + # "action": "permit", + # "address": "30.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 300 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 10 + # } + # ], + # "name": "v402" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "sequence": 10 + # } + # ], + # "name": "v403" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ], + # "changed": true, + # "commands": [ + # "no ipv6 prefix-list v601" + # ], + # + + # Using deleted + # Before state: + + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 ge 32 + # seq 100 permit 11.11.2.0/24 ge 32 + # seq 300 permit 30.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ip prefix-list v403 + # seq 10 deny 10.1.1.0/24 + # veos# + + - name: Delete device configuration + arista.eos.eos_prefix_lists: + state: deleted + + # After State: + # veos#show running-config | section prefix-list + # veos# + # + # Module Execution: + # "after": {}, + # "before": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # }, + # { + # "action": "permit", + # "address": "30.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 300 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 10 + # } + # ], + # "name": "v402" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "sequence": 10 + # } + # ], + # "name": "v403" + # } + # ] + # } + # ], + # "changed": true, + # "commands": [ + # "no ip prefix-list v401", + # "no ip prefix-list v402", + # "no ip prefix-list v403" + # ], + # + + # Using parsed: + # parse_prefix_lists.cfg + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 + # seq 100 permit 11.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # + - name: parse configs + arista.eos.eos_prefix_lists: + running_config: "{{ lookup('file', './parsed_prefix_lists.cfg') }}" + state: parsed + + # Module Execution: + # "parsed": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "sequence": 10 + # } + # ], + # "name": "v402" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ] + + # Using rendered: + - name: Render provided configuration + arista.eos.eos_prefix_lists: + config: + - afi: "ipv4" + prefix_lists: + - name: "v401" + entries: + - sequence: 25 + action: "deny" + address: "45.55.4.0/24" + - sequence: 200 + action: "permit" + address: "200.11.2.0/24" + match: + masklen: 32 + operator: "ge" + - name: "v403" + entries: + - action: "deny" + address: "10.1.1.0/24" + sequence: 10 + state: rendered + + # Module Execution: + # "rendered": [ + # "ip prefix-list v401", + # "seq 25 deny 45.55.4.0/24", + # "seq 200 permit 200.11.2.0/24 ge 32", + # "ip prefix-list v403", + # "seq 10 deny 10.1.1.0/24" + # ] + # + + # using gathered: + # Device config: + # veos#show running-config | section prefix-list + # ip prefix-list v401 + # seq 25 deny 45.55.4.0/24 + # seq 100 permit 11.11.2.0/24 ge 32 + # ! + # ip prefix-list v402 + # seq 10 deny 10.1.1.0/24 ge 32 + # ! + # ipv6 prefix-list v601 + # seq 125 deny 5000:1::/64 + # veos# + + - name: gather configs + arista.eos.eos_prefix_lists: + state: gathered + + # Module Execution: + # + # "gathered": [ + # { + # "afi": "ipv4", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "45.55.4.0/24", + # "sequence": 25 + # }, + # { + # "action": "permit", + # "address": "11.11.2.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 100 + # } + # ], + # "name": "v401" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "address": "10.1.1.0/24", + # "match": { + # "masklen": 32, + # "operator": "ge" + # }, + # "sequence": 10 + # } + # ], + # "name": "v402" + # } + # ] + # }, + # { + # "afi": "ipv6", + # "prefix_lists": [ + # { + # "entries": [ + # { + # "action": "deny", + # "address": "5000:1::/64", + # "sequence": 125 + # } + # ], + # "name": "v601" + # } + # ] + # } + # ], + + + + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_route_maps_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_route_maps_module.rst new file mode 100644 index 000000000..f194b20b5 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_route_maps_module.rst @@ -0,0 +1,3764 @@ +.. _arista.eos.eos_route_maps_module: + + +************************* +arista.eos.eos_route_maps +************************* + +**Manages Route Maps resource module** + + +Version added: 2.1.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of Route Mapd on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of route-map options
+
+
+ entries + +
+ list + / elements=dictionary +
+
+ +
Route Map entries.
+
+
+ action + +
+ string +
+
+
    Choices: +
  • deny
  • +
  • permit
  • +
+
+
Action for matching routes
+
+
+ continue_sequence + +
+ integer +
+
+ +
Route map entry sequence number.
+
+
+ description + +
+ string +
+
+ +
Description for the route map.
+
+
+ match + +
+ dictionary +
+
+ +
Route map match rules.
+
+
+ aggregate_role + +
+ dictionary +
+
+ +
Role in BGP contributor-aggregate relation.
+
+
+ contributor + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
BGP aggregate's contributor.
+
+
+ route_map + +
+ string +
+
+ +
Route map to apply against the aggregate route.
+
+
+ as + +
+ integer +
+
+ +
BGP AS number.
+
+
+ as_path + +
+ dictionary +
+
+ +
Set as-path.
+
+
+ length + +
+ string +
+
+ +
Specify as-path length ( with comparison operators like <= 60 and >= 40 ).
+
+
+ path_list + +
+ string +
+
+ +
AS path list name.
+
+
+ community + +
+ dictionary +
+
+ +
BGP community attribute.
+
+
+ community_list + +
+ string +
+
+ +
list of community names (in csv format).
+
+
+ exact_match + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do exact matching of communities.
+
+
+ instances + +
+ string +
+
+ +
Match number of community instances ( with comparison operators like <= 60 and >= 40 ).
+
+
+ extcommunity + +
+ dictionary +
+
+ +
extended community list name.
+
+
+ community_list + +
+ string +
+
+ +
list of community names (in csv format).
+
+
+ exact_match + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do exact matching of communities.
+
+
+ interface + +
+ string +
+
+ +
interface name.
+
+
+ invert_result + +
+ dictionary +
+
+ +
Invert match result.
+
+
+ aggregate_role + +
+ dictionary +
+
+ +
Role in BGP contributor-aggregate relation.
+
+
+ contributor + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
BGP aggregate's contributor.
+
+
+ route_map + +
+ string +
+
+ +
Route map to apply against the aggregate route.
+
+
+ as_path + +
+ dictionary +
+
+ +
Set as-path.
+
+
+ length + +
+ string +
+
+ +
Specify as-path length ( with comparison operators like <= 60 and >= 40 ).
+
+
+ path_list + +
+ string +
+
+ +
AS path list name.
+
+
+ community + +
+ dictionary +
+
+ +
BGP community attribute.
+
+
+ community_list + +
+ string +
+
+ +
list of community names (in csv format).
+
+
+ exact_match + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do exact matching of communities.
+
+
+ instances + +
+ string +
+
+ +
Match number of community instances ( with comparison operators like <= 60 and >= 40 ).
+
+
+ extcommunity + +
+ dictionary +
+
+ +
extended community list name.
+
+
+ community_list + +
+ string +
+
+ +
list of community names (in csv format).
+
+
+ exact_match + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do exact matching of communities.
+
+
+ large_community + +
+ dictionary +
+
+ +
extended community list name.
+
+
+ community_list + +
+ string +
+
+ +
list of community names (in csv format).
+
+
+ exact_match + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do exact matching of communities.
+
+
+ ip + +
+ dictionary +
+
+ +
Set IP specific information.
+
+
+ address + +
+ dictionary +
+
+ +
next hop destination.
+
+
+ access_list + +
+ string +
+
+ +
ip access-list.
+
+
+ dynamic + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure dynamic prefix-list.
+
+
+ prefix_list + +
+ string +
+
+ +
Prefix list.
+
+
+ next_hop + +
+ string +
+
+ +
next hop prefix list.
+
+
+ resolved_next_hop + +
+ string +
+
+ +
Route resolved prefix list.
+
+
+ ipv6 + +
+ dictionary +
+
+ +
Set IPv6 specific information.
+
+
+ address + +
+ dictionary +
+
+ +
next hop destination.
+
+
+ access_list + +
+ string +
+
+ +
ip access-list.
+
+
+ dynamic + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Configure dynamic prefix-list.
+
+
+ prefix_list + +
+ string +
+
+ +
Prefix list.
+
+
+ next_hop + +
+ string +
+
+ +
next hop prefix list.
+
+
+ resolved_next_hop + +
+ string +
+
+ +
Route resolved prefix list.
+
+
+ isis_level + +
+ string +
+
+ +
IS-IS level.
+
+
+ large_community + +
+ dictionary +
+
+ +
extended community list name.
+
+
+ community_list + +
+ string +
+
+ +
list of community names (in csv format).
+
+
+ exact_match + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do exact matching of communities.
+
+
+ local_preference + +
+ integer +
+
+ +
BGP local preference.
+
+
+ metric + +
+ integer +
+
+ +
Route metric.
+
+
+ metric_type + +
+ string +
+
+
    Choices: +
  • type-1
  • +
  • type-2
  • +
+
+
Route metric type.
+
+
+ route_type + +
+ string +
+
+ +
Route type
+
+
+ router_id + +
+ string +
+
+ +
Router ID.
+
+
+ source_protocol + +
+ string +
+
+ +
Source routing protocol,
+
+
+ tag + +
+ integer +
+
+ +
Route tag
+
+
+ sequence + +
+ integer +
+
+ +
Index in the sequence.
+
+
+ set + +
+ dictionary +
+
+ +
set route attributes.
+
+
+ as_path + +
+ dictionary +
+
+ +
Set as-path.
+
+
+ match + +
+ dictionary +
+
+ +
Match the entire as-path.
+
+
+ as_number + +
+ string +
+
+ +
as number to use (includes auto;in csv format)
+
+
+ none + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Remove matching AS numbers
+
+
+ prepend + +
+ dictionary +
+
+ +
Prepend to the as-path.
+
+
+ as_number + +
+ string +
+
+ +
as number to prepend (includes auto;in csv format)
+
+
+ last_as + +
+ integer +
+
+ +
The number of times to prepend the last AS number.
+
+
+ bgp + +
+ integer +
+
+ +
BGP AS path multipath weight.
+
+
+ community_attributes + +
+ dictionary +
+
+ +
BGP community attribute.
+
+
+ community + +
+ dictionary +
+
+ +
community attributes.
+
+
+ additive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Add to existing community.
+
+
+ delete + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Delete matching communities.
+
+
+ graceful_shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Gracefully shutdown.
+
+
+ internet + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Internet community
+
+
+ list + +
+ string +
+
+ +
community list name.
+
+
+ local_as + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not send outside local AS.
+
+
+ no_advertise + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not advertise to any peer.
+
+
+ no_export + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Do not export to next AS.
+
+
+ number + +
+ string +
+
+ +
community number (in csv format).
+
+
+ graceful_shutdown + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Graceful shutdown
+
+
+ none + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
No community attribute.
+
+
+ distance + +
+ integer +
+
+ +
Set protocol independent distance.
+
+
+ evpn + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Keep the next hop when advertising to eBGP peers.
+
+
+ extcommunity + +
+ dictionary +
+
+ +
BGP extended community attribute.
+
+
+ lbw + +
+ dictionary +
+
+ +
Link bandwith values.
+
+
+ aggregate + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Aggregate Link Bandwidth.
+
+
+ divide + +
+ string +
+
+
    Choices: +
  • equal
  • +
  • ration
  • +
+
+
Divide Link Bandwidth.
+
+
+ value + +
+ string +
+
+ +
Link Bandwidth extended community value.
+
+
+ none + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
No attribute.
+
+
+ rt + +
+ dictionary +
+
+ +
Route target extended community
+
+
+ additive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Add to the existing community.
+
+
+ delete + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Delete matching communities.
+
+
+ vpn + +
+ string +
+
+ +
VPN extended community.
+
+
+ soo + +
+ dictionary +
+
+ +
Site-of-Origin extended community.
+
+
+ additive + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Add to the existing community.
+
+
+ delete + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Delete matching communities.
+
+
+ vpn + +
+ string +
+
+ +
VPN extended community.
+
+
+ ip + +
+ dictionary +
+
+ +
Set IP specific information.
+
+
+ address + +
+ string +
+
+ +
next hop address.
+
+
+ peer_address + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use BGP peering addr as next-hop.
+
+
+ unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Keep the next hop when advertising to eBGP peer
+
+
+ ipv6 + +
+ dictionary +
+
+ +
Set IPv6 specific information.
+
+
+ address + +
+ string +
+
+ +
next hop address.
+
+
+ peer_address + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use BGP peering addr as next-hop.
+
+
+ unchanged + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Keep the next hop when advertising to eBGP peer
+
+
+ isis_level + +
+ string +
+
+ +
IS-IS level.
+
+
+ local_preference + +
+ integer +
+
+ +
BGP local preference.
+
+
+ metric + +
+ dictionary +
+
+ +
Route metric.
+
+
+ add + +
+ string +
+
+
    Choices: +
  • igp-metric
  • +
  • igp-nexthop-cost
  • +
+
+
Add igp-metric / igp-nexthop-cost
+
+
+ igp_param + +
+ string +
+
+
    Choices: +
  • igp-metric
  • +
  • igp-nexthop-cost
  • +
+
+
IGP parameter
+
+
+ value + +
+ string +
+
+ +
metric value to add or subtract(with +/- sign).
+
+
+ metric_type + +
+ string +
+
+
    Choices: +
  • type-1
  • +
  • type-2
  • +
+
+
Route metric type.
+
+
+ nexthop + +
+ dictionary +
+
+ +
Route next hop.
+
+
+ max_metric + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Set IGP max metric value.
+
+
+ value + +
+ integer +
+
+ +
IGP metric value.
+
+
+ origin + +
+ string +
+
+
    Choices: +
  • egp
  • +
  • igp
  • +
  • incomplete
  • +
+
+
Set bgp origin.
+
+
+ segment_index + +
+ integer +
+
+ +
MPLS Segment-routing Segment Index.
+
+
+ tag + +
+ integer +
+
+ +
Route tag
+
+
+ weight + +
+ integer +
+
+ +
BGP weight.
+
+
+ source + +
+ dictionary +
+
+ +
Rename/Copy configuration
+
+
+ action + +
+ string +
+
+
    Choices: +
  • rename
  • +
  • copy
  • +
+
+
rename or copy configuration
+
+
+ overwrite + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if True, overwrite existing config.
+
+
+ source_map_name + +
+ string +
+
+ +
Source route map name.
+
+
+ statement + +
+ string +
+
+ +
statement name
+
+
+ sub_route_map + +
+ dictionary +
+
+ +
Sub route map
+
+
+ invert_result + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Invert sub route map result
+
+
+ name + +
+ string +
+
+ +
sub route map name
+
+
+ route_map + +
+ string +
+
+ +
Route map name.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section route-map.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options `_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged + # Before state + # veos#show running-config | section route-map + # veos# + + - name: Merge provided configuration with device configuration + arista.eos.eos_route_maps: + config: + - route_map: "mapmerge" + entries: + - description: "merged_map" + action: "permit" + sequence: 10 + match: + router_id: 22 + - description: "newmap" + action: "deny" + sequence: 25 + continue_sequence: 45 + match: + interface: "Ethernet1" + - route_map: "mapmerge2" + entries: + - sub_route_map: + name: "mapmerge" + action: "deny" + sequence: 45 + set: + metric: + value: 25 + add: "igp-metric" + as_path: + prepend: + last_as: 2 + match: + ipv6: + resolved_next_hop: "list1" + state: merged + + # After State: + + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # description merged_map + # match router-id prefix-list 22 + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # ! + # route-map test permit 10 + # veos# + + + # Module Execution: + + # "after": [ + # { + # "entries": [ + # { + # "action": "permit", + # "description": "merged_map", + # "match": { + # "router_id": "22" + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "continue_sequence": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # } + # ], + # "before": {}, + # "changed": true, + # "commands": [ + # "route-map mapmerge permit 10", + # "match router-id prefix-list 22", + # "description merged_map", + # "route-map mapmerge deny 25", + # "match interface Ethernet1", + # "description newmap", + # "continue 45", + # "route-map mapmerge2 deny 45", + # "match ipv6 resolved-next-hop prefix-list list1", + # "set metric 25 +igp-metric", + # "set as-path prepend last-as 2", + # "sub-route-map mapmerge" + # ], + # + + # Using replaced: + + # Before State: + + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # description merged_map + # match router-id prefix-list 22 + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # ! + # veos# + + - name: Replace + arista.eos.eos_route_maps: + config: + - route_map: "mapmerge" + entries: + - action: "permit" + sequence: 10 + match: + ipv6: + resolved_next_hop: "listr" + - action: "deny" + sequence: 90 + set: + extcommunity: + rt: + vpn: "22:11" + delete: True + ip: + unchanged: True + state: replaced + + # After State: + + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # match ipv6 resolved-next-hop prefix-list listr + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge deny 90 + # set ip next-hop unchanged + # set extcommunity rt 22:11 delete + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # ! + # + # Module Execution: + # + # "after": [ + # { + # "entries": [ + # { + # "action": "permit", + # "match": { + # "ipv6": { + # "resolved_next_hop": "listr" + # } + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "continue_sequence": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # }, + # { + # "action": "deny", + # "sequence": 90, + # "set": { + # "extcommunity": { + # "rt": { + # "delete": true, + # "vpn": "22:11" + # } + # }, + # "ip": { + # "unchanged": true + # } + # } + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # }, + # { + # "entries": [ + # { + # "action": "permit", + # "sequence": 10 + # } + # ], + # "route_map": "test" + # } + # ], + # "before": [ + # { + # "entries": [ + # { + # "action": "permit", + # "description": "merged_map", + # "match": { + # "router_id": "22" + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "continue_sequence": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # } + # ], + # "changed": true, + # "commands": [ + # "route-map mapmerge permit 10", + # "match ipv6 resolved-next-hop prefix-list listr", + # "no match router-id prefix-list 22", + # "no description", + # "route-map mapmerge deny 90", + # "set extcommunity rt 22:11 delete", + # "set ip next-hop unchanged" + # ], + # + # + # Using Overridden: + + # Before state: + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # match ipv6 resolved-next-hop prefix-list listr + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge deny 90 + # set ip next-hop unchanged + # set extcommunity rt 22:11 delete + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # ! + # route-map test permit 10 + # veos# + + - name: Override + arista.eos.eos_route_maps: + config: + - route_map: "mapmerge" + entries: + - action: "permit" + sequence: 10 + match: + ipv6: + resolved_next_hop: "listr" + - action: "deny" + sequence: 90 + set: + metric: + igp_param: "igp-nexthop-cost" + state: overridden + + # After State: + + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # match ipv6 resolved-next-hop prefix-list listr + # ! + # route-map mapmerge deny 90 + # set metric igp-nexthop-cost + # veos# + # + # + # "after": [ + # { + # "entries": [ + # { + # "action": "permit", + # "match": { + # "ipv6": { + # "resolved_next_hop": "listr" + # } + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "sequence": 90, + # "set": { + # "metric": { + # "igp_param": "igp-nexthop-cost" + # } + # } + # } + # ], + # "route_map": "mapmerge" + # } + # ], + # "before": [ + # { + # "entries": [ + # { + # "action": "permit", + # "match": { + # "ipv6": { + # "resolved_next_hop": "listr" + # } + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "continue_sequence": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # }, + # { + # "action": "deny", + # "sequence": 90, + # "set": { + # "extcommunity": { + # "rt": { + # "delete": true, + # "vpn": "22:11" + # } + # }, + # "ip": { + # "unchanged": true + # } + # } + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # }, + # { + # "entries": [ + # { + # "action": "permit", + # "sequence": 10 + # } + # ], + # "route_map": "test" + # } + # ], + # "changed": true, + # "commands": [ + # "no route-map mapmerge deny 25", + # "no route-map mapmerge2 deny 45", + # "no route-map test permit 10", + # "route-map mapmerge deny 90", + # "set metric igp-nexthop-cost", + # "no set ip next-hop unchanged", + # "no set extcommunity rt 22:11 delete" + # ], + # + # Using deleted: + # Before State: + + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # description merged_map + # match router-id prefix-list 22 + # match ipv6 resolved-next-hop prefix-list listr + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge deny 90 + # set metric igp-nexthop-cost + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # veos# + + - name: Delete route-map + arista.eos.eos_route_maps: + config: + - route_map: "mapmerge" + state: deleted + become: yes + tags: + - deleted1 + + # After State: + + # veos#show running-config | section route-map + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # veos# + # + # Module Execution: + # + # "after": [ + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # } + # ], + # "before": [ + # { + # "entries": [ + # { + # "action": "permit", + # "description": "merged_map", + # "match": { + # "ipv6": { + # "resolved_next_hop": "listr" + # }, + # "router_id": "22" + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "continue": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # }, + # { + # "action": "deny", + # "sequence": 90, + # "set": { + # "metric": { + # "igp_param": "igp-nexthop-cost" + # } + # } + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # } + # ], + # "changed": true, + # "commands": [ + # "no route-map mapmerge" + # ], + + # Using deleted to delete all route-maps: + + # Before State: + + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # description merged_map + # match router-id prefix-list 22 + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # veos# + + - name: Delete all route-maps + arista.eos.eos_route_maps: + state: deleted + + # After State: + # veos#show running-config | section route-map + # veos# + # + # Module Execution: + # + # "after": {}, + # "before": [ + # { + # "entries": [ + # { + # "action": "permit", + # "description": "merged_map", + # "match": { + # "router_id": "22" + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "continue": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # } + # ], + # "changed": true, + # "commands": [ + # "no route-map mapmerge", + # "no route-map mapmerge2" + # ], + + # Using gathered: + + # Device configs: + + # veos#show running-config | section route-map + # route-map mapmerge permit 10 + # description merged_map + # match router-id prefix-list 22 + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + # veos# + + - name: gather configs + arista.eos.eos_route_maps: + state: gathered + + # Module Execution: + # "gathered": [ + # { + # "entries": [ + # { + # "action": "permit", + # "description": "merged_map", + # "match": { + # "router_id": "22" + # }, + # "sequence": 10 + # }, + # { + # "action": "deny", + # "continue_sequence": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # } + # ], + + # Using rendered: + + - name: Render provided configuration + arista.eos.eos_route_maps: + config: + - route_map: "mapmerge" + entries: + - description: "merged_map" + action: "permit" + sequence: 10 + match: + router_id: 22 + set: + bgp: 20 + - description: "newmap" + action: "deny" + sequence: 25 + continue_sequence: 45 + match: + interface: "Ethernet1" + - route_map: "mapmerge2" + entries: + - sub_route_map: + name: "mapmerge" + action: "deny" + sequence: 45 + set: + metric: + value: 25 + add: "igp-metric" + as_path: + prepend: + last_as: 2 + match: + ipv6: + resolved_next_hop: "list1" + state: rendered + + # Module Execution: + # "rendered": [ + # "route-map mapmerge permit 10", + # "match router-id prefix-list 22", + # "set bgp bestpath as-path weight 20", + # "description merged_map", + # "route-map mapmerge deny 25", + # "match interface Ethernet1", + # "description newmap", + # "continue 45", + # "route-map mapmerge2 deny 45", + # "match ipv6 resolved-next-hop prefix-list list1", + # "set metric 25 +igp-metric", + # "set as-path prepend last-as 2", + # "sub-route-map mapmerge" + # ] + + # Using parsed: + + # parsed.cfg + # route-map mapmerge permit 10 + # description merged_map + # match router-id prefix-list 22 + # set bgp bestpath as-path weight 20 + # ! + # route-map mapmerge deny 25 + # description newmap + # match interface Ethernet1 + # continue 45 + # ! + # route-map mapmerge2 deny 45 + # match ipv6 resolved-next-hop prefix-list list1 + # sub-route-map mapmerge + # set metric 25 +igp-metric + # set as-path prepend last-as 2 + + - name: parse configs + arista.eos.eos_route_maps: + running_config: "{{ lookup('file', './parsed.cfg') }}" + state: parsed + + # Module Execution: + # "parsed": [ + # { + # "entries": [ + # { + # "action": "permit", + # "description": "merged_map", + # "match": { + # "router_id": "22" + # }, + # "sequence": 10, + # "set": { + # "bgp": 20 + # } + # }, + # { + # "action": "deny", + # "continue_sequence": 45, + # "description": "newmap", + # "match": { + # "interface": "Ethernet1" + # }, + # "sequence": 25 + # } + # ], + # "route_map": "mapmerge" + # }, + # { + # "entries": [ + # { + # "action": "deny", + # "match": { + # "ipv6": { + # "resolved_next_hop": "list1" + # } + # }, + # "sequence": 45, + # "set": { + # "as_path": { + # "prepend": { + # "last_as": 2 + # } + # }, + # "metric": { + # "add": "igp-metric", + # "value": "25" + # } + # }, + # "sub_route_map": { + # "name": "mapmerge" + # } + # } + # ], + # "route_map": "mapmerge2" + # } + # ] + + + + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_snmp_server_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_snmp_server_module.rst new file mode 100644 index 000000000..f66b77d33 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_snmp_server_module.rst @@ -0,0 +1,4141 @@ +.. _arista.eos.eos_snmp_server_module: + + +************************** +arista.eos.eos_snmp_server +************************** + +**Manages snmp_server resource module** + + +Version added: 3.2.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of snmp_server on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ dictionary +
+
+ +
SNMP server configuration.
+
+
+ acls + +
+ list + / elements=dictionary +
+
+ +
ipv4/ipv6 access_lists
+
+
+ acl + +
+ string +
+
+ +
acl name
+
+
+ afi + +
+ string +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
ipv4/ipv6
+
+
+ vrf + +
+ string +
+
+ +
vrf name
+
+
+ chassis_id + +
+ string +
+
+ +
SNMP chassis identifier.
+
+
+ communities + +
+ list + / elements=dictionary +
+
+ +
Community name configuration.
+
+
+ acl_v4 + +
+ string +
+
+ +
standard access_list name
+
+
+ acl_v6 + +
+ string +
+
+ +
IPv6 access list name.
+
+
+ name + +
+ string +
+
+ +
Community name
+
+
+ ro + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Only reads are permitted.
+
+
+ rw + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Read_write access
+
+
+ view + +
+ string +
+
+ +
MIB view name
+
+
+ contact + +
+ string +
+
+ +
Person to contact about the syste,.
+
+
+ engineid + +
+ dictionary +
+
+ +
SNMPv3 engine ID configuration.
+
+
+ local + +
+ string +
+
+ +
Local SNMP agent
+
+
+ remote + +
+ dictionary +
+
+ +
Remote SNMP agent
+
+
+ host + +
+ string +
+
+ +
Hostname or IP address of remote SNMP notification host
+
+
+ id + +
+ string +
+
+ +
engine ID octet string
+
+
+ udp_port + +
+ integer +
+
+ +
The remote SNMP notification host's UDP port number.
+
+
+ extension + +
+ dictionary +
+
+ +
Configure extension script to serve an OID range
+
+
+ oneshot + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use inefficient one_shot interface
+
+
+ root_oid + +
+ string +
+
+ +
Extension root oid
+
+
+ script_location + +
+ string +
+
+ +
script location
+
+
+ groups + +
+ list + / elements=dictionary +
+
+ +
SNMP USM group
+
+
+ auth_privacy + +
+ string +
+
+
    Choices: +
  • auth
  • +
  • noauth
  • +
  • priv
  • +
+
+
auth and privacy config. Valid when version = v3.
+
+
+ context + +
+ string +
+
+ +
Specify a context to associate with the group
+
+
+ group + +
+ string +
+
+ +
SNMP group for the user
+
+
+ notify + +
+ string +
+
+ +
View to restrict notifications
+
+
+ read + +
+ string +
+
+ +
View to restrict read access
+
+
+ version + +
+ string +
+
+
    Choices: +
  • v1
  • +
  • v3
  • +
  • v2c
  • +
+
+
snmp security group version
+
+
+ write + +
+ string +
+
+ +
View to restrict write access
+
+
+ hosts + +
+ list + / elements=dictionary +
+
+ +
Notification destinations
+
+
+ host + +
+ string +
+
+ +
Hostname or IP address of SNMP notification host.
+
+
+ informs + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use SNMP inform messages.
+
+
+ traps + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Use SNMP trap messages
+
+
+ udp_port + +
+ integer +
+
+ +
UDP destination port for notification messages.
+
+
+ user + +
+ string +
+
+ +
Community or user name.
+
+
+ version + +
+ string +
+
+
    Choices: +
  • 1
  • +
  • 2c
  • +
  • 3 auth
  • +
  • 3 noauth
  • +
  • 3 priv
  • +
+
+
Notification message SNMP version.
+
+
+ vrf + +
+ string +
+
+ +
Specify the VRF in which the host is configured
+
+
+ local_interface + +
+ string +
+
+ +
Configure the source interface for SNMP notifications.
+
+
+ location + +
+ string +
+
+ +
The sysLocation string.
+
+
+ notification + +
+ integer +
+
+ +
Maximum number of notifications in the log
+
+
+ objects + +
+ dictionary +
+
+ +
when True Disable implementation of a group of objects
+
+
+ mac_address_tables + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
dot1dTpFdbTable, dot1qTpFdbTable
+
+
+ route_tables + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
ipCidrRouteTable, ipCidrRouteNumber, aristaFIBStats*
+
+
+ qos + +
+ integer +
+
+ +
Configure QoS parameters.
+
+
+ qosmib + +
+ integer +
+
+ +
Set QOS_MIB counter update interval
+
+
+ transmit + +
+ integer +
+
+ +
Maximum number of bytes in SNMP message (UDP/TCP payload)
+
+
+ transport + +
+ string +
+
+ +
Enable snmpd transport layer protocol
+
+
+ traps + +
+ dictionary +
+
+ +
Enable traps to all configured recipients.
+
+
+ bgp + +
+ dictionary +
+
+ +
Enable Bgp traps. If set to enabled , all the traps are set.
+
+
+ arista_backward_transition + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_backward_transition
+
+
+ arista_established + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_established
+
+
+ backward_transition + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
backward_transition
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ established + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
established.
+
+
+ bridge + +
+ dictionary +
+
+ +
Enable Bridge traps. If set to enabled , all the traps are set.
+
+
+ arista_mac_age + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_mac_age
+
+
+ arista_mac_learn + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_mac_learn
+
+
+ arista_mac_move + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_mac_move
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ capacity + +
+ dictionary +
+
+ +
Enable Capacity traps. If set to enabled , all the traps are set.
+
+
+ arista_hardware_utilization_alert + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_hardware_utilization_alert
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ entity + +
+ dictionary +
+
+ +
Enable Entity traps. If set to enabled , all the traps are set.
+
+
+ arista_ent_sensor_alarm + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_ent_sensor_alarm
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ ent_config_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
ent_config_change
+
+
+ ent_state_oper + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
ent_state_oper
+
+
+ ent_state_oper_disabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
ent_state_oper_disabled.
+
+
+ ent_state_oper_enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
ent_state_oper_enabled.
+
+
+ external_alarm + +
+ dictionary +
+
+ +
Enable external alarm traps. If set to enabled , all the traps are set.
+
+
+ arista_external_alarm_asserted_notif + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_external_alarm_asserted_notif
+
+
+ arista_external_alarm_deasserted_notif + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_external_alarm_deasserted_notif
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ isis + +
+ dictionary +
+
+ +
Enable isis traps. If set to enabled , all the traps are set.
+
+
+ adjacency_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
adjacency_change
+
+
+ area_mismatch + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
area_mismatch
+
+
+ attempt_to_exceed_max_sequence + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
attempt_to_exceed_max_sequence
+
+
+ authentication_type_failure + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
authentication_type_failure.
+
+
+ database_overload + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
database_overload
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ own_lsp_purge + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
own_lsp_purge
+
+
+ rejected_adjacency + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
rejected_adjacency
+
+
+ sequence_number_skip + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
sequence_number_skip.
+
+
+ lldp + +
+ dictionary +
+
+ +
Enable Lldp traps. If set to enabled , all the traps are set.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ rem_tables_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
rem_tables_change
+
+
+ mpls_ldp + +
+ dictionary +
+
+ +
Enable mpls_ldp traps. If set to enabled , all the traps are set.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ mpls_ldp_session_down + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
mpls_ldp_session_down
+
+
+ mpls_ldp_session_up + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
mpls_ldp_session_up
+
+
+ msdp + +
+ dictionary +
+
+ +
Enable msdp traps. If set to enabled , all the traps are set.
+
+
+ backward_transition + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
backward_transition.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ established + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
established.
+
+
+ ospf + +
+ dictionary +
+
+ +
Enable Ospf traps. If set to enabled , all the traps are set.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ if_auth_failure + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if_auth_failure
+
+
+ if_config_error + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if_config_error
+
+
+ if_state_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if_state_change
+
+
+ nbr_state_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
nbr_state_change.
+
+
+ ospfv3 + +
+ dictionary +
+
+ +
Enable Ospfv3 traps. If set to enabled , all the traps are set.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ if_config_error + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if_config_error
+
+
+ if_rx_bad_packet + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if_rx_bad_packet
+
+
+ if_state_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
if_state_change
+
+
+ nbr_restart_helper_status_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable ospfv3NbrRestartHelperStatusChange trap
+
+
+ nbr_state_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
nbr_state_change.
+
+
+ nssa_translator_status_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Enable ospfv3NssaTranslatorStatusChange trap
+
+
+ restart_status_change + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
restart_status_change
+
+
+ pim + +
+ dictionary +
+
+ +
Enable Pim traps. If set to enabled , all the traps are set.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ neighbor_loss + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
neighbor_loss
+
+
+ snmp + +
+ dictionary +
+
+ +
Enable snmp traps. If set to enabled , all the traps are set.
+
+
+ authentication + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
authentication
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ link_down + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
link_down
+
+
+ link_up + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
link_up
+
+
+ snmpConfigManEvent + +
+ dictionary +
+
+ +
Enable snmpConfigManEvent traps. If set to enabled , all the traps are set.
+
+
+ arista_config_man_event + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_config_man_event
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ switchover + +
+ dictionary +
+
+ +
Enable switchover traps. If set to enabled , all the traps are set.
+
+
+ arista_redundancy_switch_over_notif + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_redundancy_switch_over_notif
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ test + +
+ dictionary +
+
+ +
Enable test traps. If set to enabled , all the traps are set.
+
+
+ arista_test_notification + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
arista_test_notification
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ vrrp + +
+ dictionary +
+
+ +
Enable vrrp traps. If set to enabled , all the traps are set.
+
+
+ enabled + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
All traps are set.
+
+
+ trap_new_master + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
vrrp
+
+
+ users + +
+ list + / elements=dictionary +
+
+ +
SNMP user configuration.
+
+
+ auth + +
+ dictionary +
+
+ +
User authentication settings
+
+
+ algorithm + +
+ string +
+
+ +
algorithm for authentication
+
+
+ auth_passphrase + +
+ string +
+
+ +
authentication passphrase hex string
+
+
+ encryption + +
+ string +
+
+ +
algorithm for encryption.
+
+
+ priv_passphrase + +
+ string +
+
+ +
privacy passphrase hexstring
+
+
+ group + +
+ string +
+
+ +
SNMP group for the user.
+
+
+ localized + +
+ dictionary +
+
+ +
localized auth and privacy passphrases.
+
+
+ algorithm + +
+ string +
+
+ +
algorithm for authentication
+
+
+ auth_passphrase + +
+ string +
+
+ +
authentication passphrase hex string
+
+
+ encryption + +
+ string +
+
+ +
algorithm for encryption.
+
+
+ engineid + +
+ string +
+
+ +
Engine id
+
+
+ priv_passphrase + +
+ string +
+
+ +
privacy passphrase hexstring
+
+
+ remote + +
+ string +
+
+ +
System where an SNMPv3 user is hosted
+
+
+ udp_port + +
+ integer +
+
+ +
UDP port used by the remote SNMP system
+
+
+ user + +
+ string +
+
+ +
SNMP user name
+
+
+ version + +
+ string +
+
+
    Choices: +
  • v1
  • +
  • v2c
  • +
  • v3
  • +
+
+
snmp security version
+
+
+ views + +
+ list + / elements=dictionary +
+
+ +
SNMPv2 MIB view configuration
+
+
+ action + +
+ string +
+
+
    Choices: +
  • excluded
  • +
  • included
  • +
+
+
Action to be performed.
+
+
+ mib + +
+ string +
+
+ +
SNMP MIB name
+
+
+ view + +
+ string +
+
+ +
SNMP view name
+
+
+ vrfs + +
+ list + / elements=dictionary +
+
+ +
Specify the VRF in which the source address is used
+
+
+ local_interface + +
+ string +
+
+ +
Configure the source interface for SNMP notifications
+
+
+ vrf + +
+ string +
+
+ +
vrf name.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running_config | section snmp_server.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
The states replaced and overridden have identical behaviour for this module.
+
Please refer to examples for more details.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli`` and ``httpapi``. + + + +Examples +-------- + +.. code-block:: yaml + + # Using merged: + # Before State + # eos#show running-config | section snmp-server + # eos# + + - name: merge given snmp_server configuration + arista.eos.eos_snmp_server: + config: + communities: + - name: "comm3" + acl_v6: "list1" + view: "view1" + - name: "comm4" + acl_v4: "list3" + view: "view1" + - name: "comm5" + acl_v4: "list4" + ro: True + contact: "admin" + engineid: + remote: + host: 1.1.1.1 + id: "1234567" + groups: + - group: "group1" + version: "v1" + read: "view1" + - group: "group2" + version: "v3" + auth_privacy: "priv" + notify: "view1" + write: "view2" + hosts: + - host: "host02" + user: "user01" + udp_port: 23 + version: "2c" + - host: "host01" + user: "user01" + udp_port: 23 + version: "3 priv" + traps: + capacity: + arista_hardware_utilization_alert: True + bgp: + enabled: True + external_alarm: + arista_external_alarm_deasserted_notif: True + arista_external_alarm_asserted_notif: True + vrfs: + - vrf: "vrf01" + local_interface: "Ethernet1" + + # After state + # eos#show running-config | section snmp-server + # snmp-server community comm3 view view1 ipv6 list1 + # snmp-server community comm4 view view1 list3 + # snmp-server community comm5 ro list4 + # snmp-server group group1 v1 read view1 + # snmp-server group group2 v3 priv write view2 notify view1 + # snmp-server host host02 version 2c user01 udp-port 23 + # snmp-server host host01 version 3 priv user01 udp-port 23 + # snmp-server vrf vrf01 local-interface Ethernet1 + # snmp-server contact admin + # snmp-server enable traps bgp + # snmp-server enable traps capacity arista-hardware-utilization-alert + # snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif + # + # Module Execution + # + # "after": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list3", + # "name": "comm4", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "comm5", + # "ro": true + # } + # ], + # "contact": "admin", + # "groups": [ + # { + # "group": "group1", + # "read": "view1", + # "version": "v1" + # }, + # { + # "auth_privacy": "priv", + # "group": "group2", + # "notify": "view1", + # "version": "v3", + # "write": "view2" + # } + # ], + # "hosts": [ + # { + # "host": "host01", + # "udp_port": 23, + # "user": "user01", + # "version": "3 priv" + # }, + # { + # "host": "host02", + # "udp_port": 23, + # "user": "user01", + # "version": "2c" + # } + # ], + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "capacity": { + # "arista_hardware_utilization_alert": true + # }, + # "external_alarm": { + # "arista_external_alarm_asserted_notif": true, + # "arista_external_alarm_deasserted_notif": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf01" + # } + # ] + # }, + # "before": {}, + # "changed": true, + # "commands": [ + # "snmp-server community comm3 view view1 ipv6 list1", + # "snmp-server community comm4 view view1 list3", + # "snmp-server community comm5 ro list4", + # "snmp-server group group1 v1 read view1", + # "snmp-server group group2 v3 priv write view2 notify view1", + # "snmp-server host host02 version 2c user01 udp-port 23", + # "snmp-server host host01 version 3 priv user01 udp-port 23", + # "snmp-server vrf vrf01 local-interface Ethernet1", + # "snmp-server contact admin", + # "snmp-server engineID remote 1.1.1.1 1234567", + # "snmp-server enable traps bgp", + # "snmp-server enable traps capacity arista-hardware-utilization-alert", + # "snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif" + # ], + # + + # Using replaced: + # Before State: + # eos#show running-config | section snmp-server + # snmp-server community comm3 view view1 ipv6 list1 + # snmp-server community comm4 view view1 list3 + # snmp-server community comm5 ro list4 + # snmp-server group group1 v1 read view1 + # snmp-server group group2 v3 priv write view2 notify view1 + # snmp-server host host02 version 2c user01 udp-port 23 + # snmp-server host host01 version 3 priv user01 udp-port 23 + # snmp-server vrf vrf01 local-interface Ethernet1 + # snmp-server contact admin + # snmp-server enable traps bgp + # snmp-server enable traps capacity arista-hardware-utilization-alert + # snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif + + - name: Replace given snmp_server configuration + become: true + register: result + arista.eos.eos_snmp_server: &replaced + state: replaced + config: + communities: + - name: "comm3" + acl_v6: "list1" + view: "view1" + - name: "replacecomm" + acl_v4: "list4" + extension: + root_oid: "123456" + script_location: "flash:" + traps: + test: + arista_test_notification: True + bgp: + enabled: True + vrfs: + - vrf: "vrf_replace" + local_interface: "Ethernet1" + + # After State: + + # eos#show running-config | section snmp-server + # snmp-server community comm3 view view1 ipv6 list1 + # snmp-server community replacecomm list4 + # snmp-server vrf vrf_replace local-interface Ethernet1 + # snmp-server extension 123456 flash: + # snmp-server enable traps test arista-test-notification + # snmp-server enable traps bgp + + # Module Execution: + # "after": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "replacecomm", + # "ro": true + # } + # ], + # "extension": { + # "root_oid": "0.123456", + # "script_location": "flash:" + # }, + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "test": { + # "arista_test_notification": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf_replace" + # } + # ] + # }, + # "before": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list3", + # "name": "comm4", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "comm5", + # "ro": true + # } + # ], + # "contact": "admin", + # "groups": [ + # { + # "group": "group1", + # "read": "view1", + # "version": "v1" + # }, + # { + # "auth_privacy": "priv", + # "group": "group2", + # "notify": "view1", + # "version": "v3", + # "write": "view2" + # } + # ], + # "hosts": [ + # { + # "host": "host01", + # "udp_port": 23, + # "user": "user01", + # "version": "3 priv" + # }, + # { + # "host": "host02", + # "udp_port": 23, + # "user": "user01", + # "version": "2c" + # } + # ], + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "capacity": { + # "arista_hardware_utilization_alert": true + # }, + # "external_alarm": { + # "arista_external_alarm_asserted_notif": true, + # "arista_external_alarm_deasserted_notif": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf01" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "snmp-server community comm3 view view1 ipv6 list1", + # "snmp-server community replacecomm list4", + # "no snmp-server community comm4 view view1 ro list3", + # "no snmp-server community comm5 ro list4", + # "no snmp-server group group1 v1 read view1", + # "no snmp-server group group2 v3 priv write view2 notify view1", + # "no snmp-server host host01 version 3 priv user01 udp-port 23", + # "no snmp-server host host02 version 2c user01 udp-port 23", + # "snmp-server vrf vrf_replace local-interface Ethernet1", + # "no snmp-server vrf vrf01 local-interface Ethernet1", + # "snmp-server extension 123456 flash:", + # "default snmp-server enable traps capacity arista-hardware-utilization-alert", + # "default snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif", + # "snmp-server enable traps test arista-test-notification", + # "no snmp-server contact admin" + # ], + + # Using overridden: + # Before State: + # eos#show running-config | section snmp-server + # snmp-server community comm3 view view1 ipv6 list1 + # snmp-server community comm4 view view1 list3 + # snmp-server community comm5 ro list4 + # snmp-server group group1 v1 read view1 + # snmp-server group group2 v3 priv write view2 notify view1 + # snmp-server host host02 version 2c user01 udp-port 23 + # snmp-server host host01 version 3 priv user01 udp-port 23 + # snmp-server vrf vrf01 local-interface Ethernet1 + # snmp-server contact admin + # snmp-server enable traps bgp + # snmp-server enable traps capacity arista-hardware-utilization-alert + # snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif + + - name: Override given snmp_server configuration + arista.eos.eos_snmp_server: + state: overridden + config: + communities: + - name: "comm3" + acl_v6: "list1" + view: "view1" + - name: "replacecomm" + acl_v4: "list4" + extension: + root_oid: "123456" + script_location: "flash:" + traps: + test: + arista_test_notification: True + bgp: + enabled: True + vrfs: + - vrf: "vrf_replace" + local_interface: "Ethernet1" + + # After State: + + # eos#show running-config | section snmp-server + # snmp-server community comm3 view view1 ipv6 list1 + # snmp-server community replacecomm list4 + # snmp-server vrf vrf_replace local-interface Ethernet1 + # snmp-server extension 123456 flash: + # snmp-server enable traps test arista-test-notification + # snmp-server enable traps bgp + + # Module Execution: + # "after": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "replacecomm", + # "ro": true + # } + # ], + # "extension": { + # "root_oid": "0.123456", + # "script_location": "flash:" + # }, + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "test": { + # "arista_test_notification": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf_replace" + # } + # ] + # }, + # "before": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list3", + # "name": "comm4", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "comm5", + # "ro": true + # } + # ], + # "contact": "admin", + # "groups": [ + # { + # "group": "group1", + # "read": "view1", + # "version": "v1" + # }, + # { + # "auth_privacy": "priv", + # "group": "group2", + # "notify": "view1", + # "version": "v3", + # "write": "view2" + # } + # ], + # "hosts": [ + # { + # "host": "host01", + # "udp_port": 23, + # "user": "user01", + # "version": "3 priv" + # }, + # { + # "host": "host02", + # "udp_port": 23, + # "user": "user01", + # "version": "2c" + # } + # ], + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "capacity": { + # "arista_hardware_utilization_alert": true + # }, + # "external_alarm": { + # "arista_external_alarm_asserted_notif": true, + # "arista_external_alarm_deasserted_notif": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf01" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "snmp-server community comm3 view view1 ipv6 list1", + # "snmp-server community replacecomm list4", + # "no snmp-server community comm4 view view1 ro list3", + # "no snmp-server community comm5 ro list4", + # "no snmp-server group group1 v1 read view1", + # "no snmp-server group group2 v3 priv write view2 notify view1", + # "no snmp-server host host01 version 3 priv user01 udp-port 23", + # "no snmp-server host host02 version 2c user01 udp-port 23", + # "snmp-server vrf vrf_replace local-interface Ethernet1", + # "no snmp-server vrf vrf01 local-interface Ethernet1", + # "snmp-server extension 123456 flash:", + # "default snmp-server enable traps capacity arista-hardware-utilization-alert", + # "default snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif", + # "snmp-server enable traps test arista-test-notification", + # "no snmp-server contact admin" + # ], + + # Using deleted: + # Before State: + # eos#show running-config | section snmp-server + # snmp-server community comm3 view view1 ipv6 list1 + # snmp-server community comm4 view view1 list3 + # snmp-server community comm5 ro list4 + # snmp-server group group1 v1 read view1 + # snmp-server group group2 v3 priv write view2 notify view1 + # snmp-server host host02 version 2c user01 udp-port 23 + # snmp-server host host01 version 3 priv user01 udp-port 23 + # snmp-server vrf vrf01 local-interface Ethernet1 + # snmp-server contact admin + # snmp-server enable traps bgp + # snmp-server enable traps capacity arista-hardware-utilization-alert + # snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif + + - name: Delete given snmp_server configuration + arista.eos.eos_snmp_server: + state: deleted + + # After State: + # eos#show running-config | section snmp-server + # + + # Module Execution: + # "after": {}, + # "before": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list3", + # "name": "comm4", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "comm5", + # "ro": true + # } + # ], + # "contact": "admin", + # "groups": [ + # { + # "group": "group1", + # "read": "view1", + # "version": "v1" + # }, + # { + # "auth_privacy": "priv", + # "group": "group2", + # "notify": "view1", + # "version": "v3", + # "write": "view2" + # } + # ], + # "hosts": [ + # { + # "host": "host01", + # "udp_port": 23, + # "user": "user01", + # "version": "3 priv" + # }, + # { + # "host": "host02", + # "udp_port": 23, + # "user": "user01", + # "version": "2c" + # } + # ], + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "capacity": { + # "arista_hardware_utilization_alert": true + # }, + # "external_alarm": { + # "arista_external_alarm_asserted_notif": true, + # "arista_external_alarm_deasserted_notif": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf01" + # } + # ] + # }, + # "changed": true, + # "commands": [ + # "no snmp-server community comm3 view view1 ro ipv6 list1", + # "no snmp-server community comm4 view view1 ro list3", + # "no snmp-server community comm5 ro list4", + # "no snmp-server group group1 v1 read view1", + # "no snmp-server group group2 v3 priv write view2 notify view1", + # "no snmp-server host host01 version 3 priv user01 udp-port 23", + # "no snmp-server host host02 version 2c user01 udp-port 23", + # "no snmp-server vrf vrf01 local-interface Ethernet1", + # "no snmp-server contact admin", + # "default snmp-server enable traps bgp", + # "default snmp-server enable traps capacity arista-hardware-utilization-alert", + # "default snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif" + # ], + # + + # Using parsed: + + # _parsed.cfg + # snmp-server contact admin + # snmp-server vrf vrf01 local-interface Ethernet1 + # snmp-server community comm3 view view1 ro ipv6 list1 + # snmp-server community comm4 view view1 ro list3 + # snmp-server community comm5 ro list4 + # snmp-server group group1 v1 read view1 + # snmp-server group group2 v3 priv write view2 notify view1 + # snmp-server host host01 version 3 priv user01 udp-port 23 + # snmp-server host host02 version 2c user01 udp-port 23 + # snmp-server enable traps bgp + # snmp-server enable traps capacity arista-hardware-utilization-alert + # snmp-server enable traps external-alarm arista-external-alarm-asserted-notif + # snmp-server enable traps external-alarm arista-external-alarm-deasserted-notif + + - name: Provide the running configuration for parsing (config to be parsed) + arista.eos.eos_snmp_server: + running_config: "{{ lookup('file', '_parsed.cfg') }}" + state: parsed + + # Module Execution: + # "parsed": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list3", + # "name": "comm4", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "comm5", + # "ro": true + # } + # ], + # "contact": "admin", + # "groups": [ + # { + # "group": "group1", + # "read": "view1", + # "version": "v1" + # }, + # { + # "auth_privacy": "priv", + # "group": "group2", + # "notify": "view1", + # "version": "v3", + # "write": "view2" + # } + # ], + # "hosts": [ + # { + # "host": "host01", + # "udp_port": 23, + # "user": "user01", + # "version": "3 priv" + # }, + # { + # "host": "host02", + # "udp_port": 23, + # "user": "user01", + # "version": "2c" + # } + # ], + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "capacity": { + # "arista_hardware_utilization_alert": true + # }, + # "external_alarm": { + # "arista_external_alarm_asserted_notif": true, + # "arista_external_alarm_deasserted_notif": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf01" + # } + # ] + # } + + # Using rendered: + - name: Render given snmp_server configuration + arista.eos.eos_snmp_server: + state: "rendered" + config: + communities: + - name: "comm3" + acl_v6: "list1" + view: "view1" + - name: "comm4" + acl_v4: "list3" + view: "view1" + - name: "comm5" + acl_v4: "list4" + ro: True + contact: "admin" + engineid: + remote: + host: 1.1.1.1 + id: "1234567" + groups: + - group: "group1" + version: "v1" + read: "view1" + - group: "group2" + version: "v3" + auth_privacy: "priv" + notify: "view1" + write: "view2" + hosts: + - host: "host02" + user: "user01" + udp_port: 23 + version: "2c" + - host: "host01" + user: "user01" + udp_port: 23 + version: "3 priv" + traps: + capacity: + arista_hardware_utilization_alert: True + bgp: + enabled: True + external_alarm: + arista_external_alarm_deasserted_notif: True + arista_external_alarm_asserted_notif: True + vrfs: + - vrf: "vrf01" + local_interface: "Ethernet1" + + # Module Execution: + # "rendered": [ + # "snmp-server community comm3 view view1 ipv6 list1", + # "snmp-server community comm4 view view1 list3", + # "snmp-server community comm5 ro list4", + # "snmp-server group group1 v1 read view1", + # "snmp-server group group2 v3 priv write view2 notify view1", + # "snmp-server host host02 version 2c user01 udp-port 23", + # "snmp-server host host01 version 3 priv user01 udp-port 23", + # "snmp-server vrf vrf01 local-interface Ethernet1", + # "snmp-server contact admin", + # "snmp-server engineID remote 1.1.1.1 1234567", + # "snmp-server enable traps bgp", + # "snmp-server enable traps capacity arista-hardware-utilization-alert", + # "snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif" + # ] + + # using gathered: + + # eos#show running-config | section snmp-server + # snmp-server community comm3 view view1 ipv6 list1 + # snmp-server community comm4 view view1 list3 + # snmp-server community comm5 ro list4 + # snmp-server group group1 v1 read view1 + # snmp-server group group2 v3 priv write view2 notify view1 + # snmp-server host host02 version 2c user01 udp-port 23 + # snmp-server host host01 version 3 priv user01 udp-port 23 + # snmp-server vrf vrf01 local-interface Ethernet1 + # snmp-server contact admin + # snmp-server enable traps bgp + # snmp-server enable traps capacity arista-hardware-utilization-alert + # snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif + + - name: Gathered the provided configuration with the exisiting running configuration + arista.eos.eos_snmp_server: + config: + state: gathered + + # Module Execution: + # "gathered": { + # "communities": [ + # { + # "acl_v6": "list1", + # "name": "comm3", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list3", + # "name": "comm4", + # "ro": true, + # "view": "view1" + # }, + # { + # "acl_v4": "list4", + # "name": "comm5", + # "ro": true + # } + # ], + # "contact": "admin", + # "groups": [ + # { + # "group": "group1", + # "read": "view1", + # "version": "v1" + # }, + # { + # "auth_privacy": "priv", + # "group": "group2", + # "notify": "view1", + # "version": "v3", + # "write": "view2" + # } + # ], + # "hosts": [ + # { + # "host": "host01", + # "udp_port": 23, + # "user": "user01", + # "version": "3 priv" + # }, + # { + # "host": "host02", + # "udp_port": 23, + # "user": "user01", + # "version": "2c" + # } + # ], + # "traps": { + # "bgp": { + # "enabled": true + # }, + # "capacity": { + # "arista_hardware_utilization_alert": true + # }, + # "external_alarm": { + # "arista_external_alarm_asserted_notif": true, + # "arista_external_alarm_deasserted_notif": true + # } + # }, + # "vrfs": [ + # { + # "local_interface": "Ethernet1", + # "vrf": "vrf01" + # } + # ] + # }, + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ dictionary +
+
when changed +
The resulting configuration after module execution.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ before + +
+ dictionary +
+
when state is merged, replaced, overridden, deleted or purged +
The configuration prior to the module execution.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ commands + +
+ list +
+
when state is merged, replaced, overridden, deleted or purged +
The set of commands pushed to the remote device.
+
+
Sample:
+
['snmp-server community comm3 view view1 ipv6 list1', 'snmp-server community comm4 view view1 list3', 'snmp-server community comm5 ro list4', 'snmp-server group group1 v1 read view1', 'snmp-server group group2 v3 priv write view2 notify view1', 'snmp-server host host02 version 2c user01 udp-port 23', 'snmp-server host host01 version 3 priv user01 udp-port 23', 'snmp-server vrf vrf01 local-interface Ethernet1', 'snmp-server contact admin', 'snmp-server engineID remote 1.1.1.1 1234567', 'snmp-server enable traps bgp', 'snmp-server enable traps capacity arista-hardware-utilization-alert', 'snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif']
+
+
+ gathered + +
+ list +
+
when state is gathered +
Facts about the network resource gathered from the remote device as structured data.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ parsed + +
+ list +
+
when state is parsed +
The device native config provided in running_config option parsed into structured data as per module argspec.
+
+
Sample:
+
This output will always be in the same format as the module argspec.
+
+
+ rendered + +
+ list +
+
when state is rendered +
The provided configuration in the task rendered in device-native format (offline).
+
+
Sample:
+
['snmp-server community comm3 view view1 ipv6 list1', 'snmp-server community comm4 view view1 list3', 'snmp-server community comm5 ro list4', 'snmp-server group group1 v1 read view1', 'snmp-server group group2 v3 priv write view2 notify view1', 'snmp-server host host02 version 2c user01 udp-port 23', 'snmp-server host host01 version 3 priv user01 udp-port 23', 'snmp-server vrf vrf01 local-interface Ethernet1', 'snmp-server contact admin', 'snmp-server engineID remote 1.1.1.1 1234567', 'snmp-server enable traps bgp', 'snmp-server enable traps capacity arista-hardware-utilization-alert', 'snmp-server enable traps external-alarm arista-external-alarm-asserted-notif arista-external-alarm-deasserted-notif']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_static_routes_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_static_routes_module.rst new file mode 100644 index 000000000..253d331b4 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_static_routes_module.rst @@ -0,0 +1,1259 @@ +.. _arista.eos.eos_static_routes_module: + + +**************************** +arista.eos.eos_static_routes +**************************** + +**Static routes resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module configures and manages the attributes of static routes on Arista EOS platforms. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A list of configurations for static routes.
+
+
+ address_families + +
+ list + / elements=dictionary +
+
+ +
A dictionary specifying the address family to which the static route(s) belong.
+
+
+ afi + +
+ string + / required +
+
+
    Choices: +
  • ipv4
  • +
  • ipv6
  • +
+
+
Specifies the top level address family indicator.
+
+
+ routes + +
+ list + / elements=dictionary +
+
+ +
A dictionary that specifies the static route configurations.
+
+
+ dest + +
+ string + / required +
+
+ +
Destination IPv4 subnet (CIDR or address-mask notation).
+
The address format is <v4/v6 address>/<mask> or <v4/v6 address> <mask>.
+
The mask is number in range 0-32 for IPv4 and in range 0-128 for IPv6.
+
+
+ next_hops + +
+ list + / elements=dictionary +
+
+ +
Details of route to be taken.
+
+
+ admin_distance + +
+ integer +
+
+ +
Preference or administrative distance of route (range 1-255).
+
+
+ description + +
+ string +
+
+ +
Name of the static route.
+
+
+ forward_router_address + +
+ string +
+
+ +
Forwarding router's address on destination interface.
+
+
+ interface + +
+ string +
+
+ +
Outgoing interface to take. For anything except 'null0', then next hop IP address should also be configured.
+
IP address of the next hop router or
+
null0 Null0 interface or
+
ethernet e_num Ethernet interface or
+
loopback l_num Loopback interface or
+
management m_num Management interface or
+
port-channel p_num
+
vlan v_num
+
vxlan vx_num
+
Nexthop-Group Specify nexthop group name
+
Tunnel Tunnel interface
+
vtep Configure VXLAN Tunnel End Points
+
+
+ mpls_label + +
+ integer +
+
+ +
MPLS label
+
+
+ nexthop_grp + +
+ string +
+
+ +
Nexthop group
+
+
+ tag + +
+ integer +
+
+ +
Route tag value (ranges from 0 to 4294967295).
+
+
+ track + +
+ string +
+
+ +
Track value (range 1 - 512). Track must already be configured on the device before adding the route.
+
+
+ vrf + +
+ string +
+
+ +
VRF of the destination.
+
+
+ vrf + +
+ string +
+
+ +
The VRF to which the static route(s) belong.
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | grep routes.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value is then returned in the parsed key within the result.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • deleted
  • +
  • merged ←
  • +
  • overridden
  • +
  • replaced
  • +
  • gathered
  • +
  • rendered
  • +
  • parsed
  • +
+
+
The state the configuration should be left in.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using deleted + + # Before State: + # ------------ + + # veos(config)#show running-config | grep route + # ip route vrf testvrf 22.65.1.0/24 Null0 90 name testroute + # ipv6 route 5222:5::/64 Management1 4312:100::1 + # ipv6 route vrf testvrf 2222:6::/64 Management1 4312:100::1 + # ipv6 route vrf testvrf 2222:6::/64 Ethernet1 55 + # ipv6 route vrf testvrf 2222:6::/64 Null0 90 name testroute1 + # veos(config)# + + - name: Delete afi + arista.eos.eos_static_routes: + config: + - vrf: testvrf + address_families: + - afi: ipv4 + state: deleted + + # "after": [ + # { + # "address_families": [ + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "5222:5::/64", + # "next_hops": [ + # { + # "forward_router_address": "4312:100::1", + # "interface": "Management1" + # } + # ] + # } + # ] + # } + # ] + # }, + # { + # "address_families": [ + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "2222:6::/64", + # "next_hops": [ + # { + # "forward_router_address": "4312:100::1", + # "interface": "Management1" + # }, + # { + # "admin_distance": 55, + # "interface": "Ethernet1" + # }, + # { + # "admin_distance": 90, + # "description": "testroute1", + # "interface": "Null0" + # } + # ] + # } + # ] + # } + # ], + # "vrf": "testvrf" + # } + # ], + # "before": [ + # { + # "address_families": [ + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "5222:5::/64", + # "next_hops": [ + # { + # "forward_router_address": "4312:100::1", + # "interface": "Management1" + # } + # ] + # } + # ] + # } + # ] + # }, + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "22.65.1.0/24", + # "next_hops": [ + # { + # "admin_distance": 90, + # "description": "testroute", + # "interface": "Null0" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "2222:6::/64", + # "next_hops": [ + # { + # "forward_router_address": "4312:100::1", + # "interface": "Management1" + # }, + # { + # "admin_distance": 55, + # "interface": "Ethernet1" + # }, + # { + # "admin_distance": 90, + # "description": "testroute1", + # "interface": "Null0" + # } + # ] + # } + # ] + # } + # ], + # "vrf": "testvrf" + # } + # ], + # "changed": true, + # "commands": [ + # "no ip route vrf testvrf 22.65.1.0/24 Null0 90 name testroute" + # ], + + # After State + # ___________ + + # veos(config)#show running-config | grep route + # ipv6 route 5222:5::/64 Management1 4312:100::1 + # ipv6 route vrf testvrf 2222:6::/64 Management1 4312:100::1 + # ipv6 route vrf testvrf 2222:6::/64 Ethernet1 55 + # ipv6 route vrf testvrf 2222:6::/64 Null0 90 name testroute1 + + # + # Using merged + + # Before : [ + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "165.10.1.0/24", + # "next_hops": [ + # { + # "admin_distance": 100, + # "interface": "Ethernet1" + # } + # ] + # }, + # { + # "dest": "172.17.252.0/24", + # "next_hops": [ + # { + # "nexthop_grp": "testgroup" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "5001::/64", + # "next_hops": [ + # { + # "admin_distance": 50, + # "interface": "Ethernet1" + # } + # ] + # } + # ] + # } + # ] + # }, + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "130.1.122.0/24", + # "next_hops": [ + # { + # "interface": "Ethernet1", + # "tag": 50 + # } + # ] + # } + # ] + # } + # ], + # "vrf": "testvrf" + # } + # ] + # + # Before State + # ------------- + # veos(config)#show running-config | grep "route" + # ip route 165.10.1.0/24 Ethernet1 100 + # ip route 172.17.252.0/24 Nexthop-Group testgroup + # ip route vrf testvrf 130.1.122.0/24 Ethernet1 tag 50 + # ipv6 route 5001::/64 Ethernet1 50 + # veos(config)# + + - name: Merge new static route configuration + arista.eos.eos_static_routes: + config: + - vrf: testvrf + address_families: + - afi: ipv6 + routes: + - dest: 2211::0/64 + next_hop: + - forward_router_address: 100:1::2 + interface: Ethernet1 + state: merged + + # After State + # ----------- + + #After [ + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "165.10.1.0/24", + # "next_hops": [ + # { + # "admin_distance": 100, + # "interface": "Ethernet1" + # } + # ] + # }, + # { + # "dest": "172.17.252.0/24", + # "next_hops": [ + # { + # "nexthop_grp": "testgroup" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "5001::/64", + # "next_hops": [ + # { + # "admin_distance": 50, + # "interface": "Ethernet1" + # } + # ] + # } + # ] + # } + # ] + # }, + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "130.1.122.0/24", + # "next_hops": [ + # { + # "interface": "Ethernet1", + # "tag": 50 + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "2211::0/64", + # "next_hops": [ + # { + # "aforward_router_address": 100:1::2 + # "interface": "Ethernet1" + # } + # ] + # } + # ] + # } + + # ], + # "vrf": "testvrf" + # } + # ] + # + # veos(config)#show running-config | grep "route" + # ip route 165.10.1.0/24 Ethernet1 100 + # ip route 172.17.252.0/24 Nexthop-Group testgroup + # ip route vrf testvrf 130.1.122.0/24 Ethernet1 tag 50 + # ipv6 route 2211::/64 Ethernet1 100:1::2 + # ipv6 route 5001::/64 Ethernet1 50 + # veos(config)# + + + # Using overridden + + + # Before State + # ------------- + + # "before": [ + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "165.10.1.0/24", + # "next_hops": [ + # { + # "admin_distance": 100, + # "interface": "Ethernet1" + # } + # ] + # }, + # { + # "dest": "172.17.252.0/24", + # "next_hops": [ + # { + # "nexthop_grp": "testgroup" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "5001::/64", + # "next_hops": [ + # { + # "admin_distance": 50, + # "interface": "Ethernet1" + # } + # ] + # } + # ] + # } + # ] + # }, + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "130.1.122.0/24", + # "next_hops": [ + # { + # "interface": "Ethernet1", + # "tag": 50 + # } + # ] + # } + # ] + # } + # ], + # "vrf": "testvrf" + # } + # ] + # veos(config)#show running-config | grep "route" + # ip route 165.10.1.0/24 Ethernet1 100 + # ip route 172.17.252.0/24 Nexthop-Group testgroup + # ip route vrf testvrf 130.1.122.0/24 Ethernet1 tag 50 + # ipv6 route 5001::/64 Ethernet1 50 + # veos(config)# + + - name: Overridden static route configuration + arista.eos.eos_static_routes: + config: + - address_families: + - afi: ipv4 + routes: + - dest: 10.2.2.0/24 + next_hop: + - interface: Ethernet1 + state: replaced + + # After State + # ----------- + + # "after": [ + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "10.2.2.0/24", + # "next_hops": [ + # { + # "interface": "Ethernet1" + # } + # ] + # } + # ] + # } + # ] + # } + # ] + # veos(config)#show running-config | grep "route" + # ip route 10.2.2.0/24 Ethernet1 + # veos(config)# + + + # Using replaced + + # Before State + # ------------- + + # ip route 10.2.2.0/24 Ethernet1 + # ip route 10.2.2.0/24 64.1.1.1 label 17 33 + # ip route 33.33.33.0/24 Nexthop-Group testgrp + # ip route vrf testvrf 22.65.1.0/24 Null0 90 name testroute + # ipv6 route 5222:5::/64 Management1 4312:100::1 + # ipv6 route vrf testvrf 2222:6::/64 Management1 4312:100::1 + # ipv6 route vrf testvrf 2222:6::/64 Ethernet1 55 + # ipv6 route vrf testvrf 2222:6::/64 Null0 90 name testroute1 + + # [ + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "10.2.2.0/24", + # "next_hops": [ + # { + # "interface": "Ethernet1" + # }, + # { + # "admin_distance": 33, + # "interface": "64.1.1.1", + # "mpls_label": 17 + # } + # ] + # }, + # { + # "dest": "33.33.33.0/24", + # "next_hops": [ + # { + # "nexthop_grp": "testgrp" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "5222:5::/64", + # "next_hops": [ + # { + # "forward_router_address": "4312:100::1", + # "interface": "Management1" + # } + # ] + # } + # ] + # } + # ] + # }, + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "22.65.1.0/24", + # "next_hops": [ + # { + # "admin_distance": 90, + # "description": "testroute", + # "interface": "Null0" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "2222:6::/64", + # "next_hops": [ + # { + # "forward_router_address": "4312:100::1", + # "interface": "Management1" + # }, + # { + # "admin_distance": 90, + # "description": "testroute1", + # "interface": "Null0" + # } + # ] + # } + # ] + # } + # ], + # "vrf": "testvrf" + # } + # ] + + - name: Replace nexthop + arista.eos.eos_static_routes: + config: + - vrf: testvrf + address_families: + - afi: ipv6 + routes: + - dest: 2222:6::/64 + next_hops: + - admin_distance: 55 + interface: Ethernet1 + state: replaced + + # After State + # ----------- + + # veos(config)#show running-config | grep route + # ip route 10.2.2.0/24 Ethernet1 + # ip route 10.2.2.0/24 64.1.1.1 label 17 33 + # ip route 33.33.33.0/24 Nexthop-Group testgrp + # ip route vrf testvrf 22.65.1.0/24 Null0 90 name testroute + # ipv6 route 5222:5::/64 Management1 4312:100::1 + # ipv6 route vrf testvrf 2222:6::/64 Ethernet1 55 + + # "after": [ + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "10.2.2.0/24", + # "next_hops": [ + # { + # "interface": "Ethernet1" + # }, + # { + # "admin_distance": 33, + # "interface": "64.1.1.1", + # "mpls_label": 17 + # } + # ] + # }, + # { + # "dest": "33.33.33.0/24", + # "next_hops": [ + # { + # "nexthop_grp": "testgrp" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "5222:5::/64", + # "next_hops": [ + # { + # "forward_router_address": "4312:100::1", + # "interface": "Management1" + # } + # ] + # } + # ] + # } + # ] + # }, + # { + # "address_families": [ + # { + # "afi": "ipv4", + # "routes": [ + # { + # "dest": "22.65.1.0/24", + # "next_hops": [ + # { + # "admin_distance": 90, + # "description": "testroute", + # "interface": "Null0" + # } + # ] + # } + # ] + # }, + # { + # "afi": "ipv6", + # "routes": [ + # { + # "dest": "2222:6::/64", + # "next_hops": [ + # { + # "admin_distance": 55, + # "interface": "Ethernet1" + # } + # ] + # } + # ] + # } + # ], + # "vrf": "testvrf" + # } + # ] + + # Before State + # ------------- + # veos(config)#show running-config | grep "route" + # ip route 165.10.1.0/24 Ethernet1 10.1.1.2 100 + # ipv6 route 5001::/64 Ethernet1 + # veos(config)# + + + - name: Gather the exisitng condiguration + arista.eos.eos_static_routes: + state: gathered + + # returns : + # arista.eos.eos_static_routes: + # config: + # - address_families: + # - afi: ipv4 + # routes: + # - dest: 165.10.1.0/24 + # next_hop: + # - forward_router_address: 10.1.1.2 + # interface: "Ethernet1" + # admin_distance: 100 + # - afi: ipv6 + # routes: + # - dest: 5001::/64 + # next_hop: + # - interface: "Ethernet1" + + + # Using rendered + + # arista.eos.eos_static_routes: + # config: + # - address_families: + # - afi: ipv4 + # routes: + # - dest: 165.10.1.0/24 + # next_hop: + # - forward_router_address: 10.1.1.2 + # interface: "Ethernet1" + # admin_distance: 100 + # - afi: ipv6 + # routes: + # - dest: 5001::/64 + # next_hop: + # - interface: "Ethernet1" + + # returns: + + # ip route 165.10.1.0/24 Ethernet1 10.1.1.2 100 + # ipv6 route 5001::/64 Ethernet1 + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The resulting configuration model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration prior to the model invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['ip route vrf vrf1 192.2.2.0/24 125.2.3.1 93']
+
+
+ gathered + +
+ list +
+
When state is gathered +
The configuration as structured data transformed for the running configuration fetched from remote host
+
+
Sample:
+
The configuration returned will always be in the same format of the parameters above.
+
+
+ parsed + +
+ list +
+
When state is parsed +
The configuration as structured data transformed for the value of running_config option
+
+
Sample:
+
The configuration returned will always be in the same format of the parameters above.
+
+
+ rendered + +
+ list +
+
When state is rendered +
The set of CLI commands generated from the value in config option
+
+
Sample:
+
"address_families": [ + { + "afi": "ipv4", + "routes": [ + { + "dest": "192.2.2.0/24", + "next_hops": [ + { + "admin_distance": 93, + "description": null, + "forward_router_address": null, + "interface": "125.2.3.1", + "mpls_label": null, + "nexthop_grp": null, + "tag": null, + "track": null, + "vrf": null + } + ] + } + ] + } + ], + "vrf": "vrf1" + } + ], + "running_config": null, + "state": "rendered" + }
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Gomathi Selvi Srinivasan (@GomathiselviS) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_system_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_system_module.rst new file mode 100644 index 000000000..3ec8dcdb9 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_system_module.rst @@ -0,0 +1,243 @@ +.. _arista.eos.eos_system_module: + + +********************* +arista.eos.eos_system +********************* + +**Manage the system attributes on Arista EOS devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of node system attributes on Arista EOS devices. It provides an option to configure host system parameters or remove those parameters from the device active configuration. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ domain_list + +
+ list + / elements=string +
+
+ +
Provides the list of domain suffixes to append to the hostname for the purpose of doing name resolution. This argument accepts a list of names and will be reconciled with the current active configuration on the running node.
+

aliases: domain_search
+
+
+ domain_name + +
+ string +
+
+ +
Configure the IP domain name on the remote device to the provided value. Value should be in the dotted name form and will be appended to the hostname to create a fully-qualified domain name.
+
+
+ hostname + +
+ string +
+
+ +
Configure the device hostname parameter. This option takes an ASCII string value.
+
+
+ lookup_source + +
+ list + / elements=raw +
+
+ +
Provides one or more source interfaces to use for performing DNS lookups. The interface provided in lookup_source can only exist in a single VRF. This argument accepts either a list of interface names or a list of hashes that configure the interface name and VRF name. See examples.
+
+
+ name_servers + +
+ list + / elements=string +
+
+ +
List of DNS name servers by IP address to use to perform name resolution lookups. This argument accepts either a list of DNS servers or a list of hashes that configure the name server and VRF name. See examples.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the configuration values in the device's current active configuration. When set to present, the values should be configured in the device active configuration and when set to absent the values should not be in the device active configuration
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: configure hostname and domain-name + arista.eos.eos_system: + hostname: eos01 + domain_name: test.example.com + + - name: remove configuration + arista.eos.eos_system: + state: absent + + - name: configure DNS lookup sources + arista.eos.eos_system: + lookup_source: Management1 + + - name: configure DNS lookup sources with VRF support + arista.eos.eos_system: + lookup_source: + - interface: Management1 + vrf: mgmt + - interface: Ethernet1 + vrf: myvrf + + - name: configure name servers + arista.eos.eos_system: + name_servers: + - 8.8.8.8 + - 8.8.4.4 + + - name: configure name servers with VRF support + arista.eos.eos_system: + name_servers: + - {server: 8.8.8.8, vrf: mgmt} + - {server: 8.8.4.4, vrf: mgmt} + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['hostname eos01', 'dns domain test.example.com']
+
+
+ session_name + +
+ string +
+
changed +
The EOS config session name used to load the configuration
+
+
Sample:
+
ansible_1479315771
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_user_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_user_module.rst new file mode 100644 index 000000000..16bedf51c --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_user_module.rst @@ -0,0 +1,446 @@ +.. _arista.eos.eos_user_module: + + +******************* +arista.eos.eos_user +******************* + +**Manage the collection of local users on EOS devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of the local usernames configured on Arista EOS devices. It allows playbooks to manage either individual usernames or the collection of usernames in the current running config. It also supports purging usernames from the configuration that are not explicitly defined. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
The set of username objects to be configured on the remote Arista EOS device. The list entries can either be the username or a hash of username and properties. This argument is mutually exclusive with the username argument.
+

aliases: users, collection
+
+
+ configured_password + +
+ string +
+
+ +
The password to be configured on the remote Arista EOS device. The password needs to be provided in clear and it will be encrypted on the device.
+
+
+ name + +
+ string +
+
+ +
The username to be configured on the remote Arista EOS device. This argument accepts a stringv value and is mutually exclusive with the aggregate argument.
+
+
+ nopassword + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Defines the username without assigning a password. This will allow the user to login to the system without being authenticated by a password.
+
+
+ privilege + +
+ integer +
+
+ +
The privilege argument configures the privilege level of the user when logged into the system. This argument accepts integer values in the range of 1 to 15.
+
+
+ role + +
+ string +
+
+ +
Configures the role for the username in the device running configuration. The argument accepts a string value defining the role name. This argument does not check if the role has been configured on the device.
+
+
+ sshkey + +
+ string +
+
+ +
Specifies the SSH public key to configure for the given username. This argument accepts a valid SSH key value.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present
  • +
  • absent
  • +
+
+
Configures the state of the username definition as it relates to the device operational configuration. When set to present, the username(s) should be configured in the device active configuration and when set to absent the username(s) should not be in the device active configuration
+
+
+ update_password + +
+ string +
+
+
    Choices: +
  • on_create
  • +
  • always
  • +
+
+
Since passwords are encrypted in the device running config, this argument will instruct the module when to change the password. When set to always, the password will always be updated in the device and when set to on_create the password will be updated only if the username is created.
+
+
+ configured_password + +
+ string +
+
+ +
The password to be configured on the remote Arista EOS device. The password needs to be provided in clear and it will be encrypted on the device.
+
+
+ name + +
+ string +
+
+ +
The username to be configured on the remote Arista EOS device. This argument accepts a stringv value and is mutually exclusive with the aggregate argument.
+
+
+ nopassword + +
+ boolean +
+
+
    Choices: +
  • no
  • +
  • yes
  • +
+
+
Defines the username without assigning a password. This will allow the user to login to the system without being authenticated by a password.
+
+
+ privilege + +
+ integer +
+
+ +
The privilege argument configures the privilege level of the user when logged into the system. This argument accepts integer values in the range of 1 to 15.
+
+
+ purge + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Instructs the module to consider the resource definition absolute. It will remove any previously configured usernames on the device with the exception of the `admin` user which cannot be deleted per EOS constraints.
+
+
+ role + +
+ string +
+
+ +
Configures the role for the username in the device running configuration. The argument accepts a string value defining the role name. This argument does not check if the role has been configured on the device.
+
+
+ sshkey + +
+ string +
+
+ +
Specifies the SSH public key to configure for the given username. This argument accepts a valid SSH key value.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
Configures the state of the username definition as it relates to the device operational configuration. When set to present, the username(s) should be configured in the device active configuration and when set to absent the username(s) should not be in the device active configuration
+
+
+ update_password + +
+ string +
+
+
    Choices: +
  • on_create
  • +
  • always ←
  • +
+
+
Since passwords are encrypted in the device running config, this argument will instruct the module when to change the password. When set to always, the password will always be updated in the device and when set to on_create the password will be updated only if the username is created.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: create a new user + arista.eos.eos_user: + name: ansible + sshkey: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" + state: present + + - name: remove all users except admin + arista.eos.eos_user: + purge: yes + + - name: set multiple users to privilege level 15 + arista.eos.eos_user: + aggregate: + - name: netop + - name: netend + privilege: 15 + state: present + + - name: Change Password for User netop + arista.eos.eos_user: + username: netop + configured_password: '{{ new_password }}' + update_password: always + state: present + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['name ansible secret password', 'name admin secret admin']
+
+
+ session_name + +
+ string +
+
when changed is True +
The EOS config session name used to load the configuration
+
+
Sample:
+
ansible_1479315771
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Peter Sprygada (@privateip) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_vlans_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_vlans_module.rst new file mode 100644 index 000000000..fc9714ccb --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_vlans_module.rst @@ -0,0 +1,420 @@ +.. _arista.eos.eos_vlans_module: + + +******************** +arista.eos.eos_vlans +******************** + +**VLANs resource module** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of VLANs on Arista EOS network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ config + +
+ list + / elements=dictionary +
+
+ +
A dictionary of VLANs options
+
+
+ name + +
+ string +
+
+ +
Name of the VLAN.
+
+
+ state + +
+ string +
+
+
    Choices: +
  • active
  • +
  • suspend
  • +
+
+
Operational state of the VLAN
+
+
+ vlan_id + +
+ integer + / required +
+
+ +
ID of the VLAN. Range 1-4094
+
+
+ running_config + +
+ string +
+
+ +
This option is used only with state parsed.
+
The value of this option should be the output received from the EOS device by executing the command show running-config | section vlan.
+
The state parsed reads the configuration from running_config option and transforms it into Ansible structured data as per the resource module's argspec and the value
+
+
+ state + +
+ string +
+
+
    Choices: +
  • merged ←
  • +
  • replaced
  • +
  • overridden
  • +
  • deleted
  • +
  • rendered
  • +
  • gathered
  • +
  • parsed
  • +
+
+
The state of the configuration after module completion
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + - This module works with connection ``network_cli``. See the `EOS Platform Options <../network/user_guide/platform_eos.html>`_. + + + +Examples +-------- + +.. code-block:: yaml + + # Using deleted + + # Before state: + # ------------- + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 10 + # name ten + # ! + # vlan 20 + # name twenty + + - name: Delete attributes of the given VLANs. + arista.eos.eos_vlans: + config: + - vlan_id: 20 + state: deleted + + # After state: + # ------------ + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 10 + # name ten + + + # Using merged + + # Before state: + # ------------- + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 10 + # name ten + # ! + # vlan 20 + # name twenty + + - name: Merge given VLAN attributes with device configuration + arista.eos.eos_vlans: + config: + - vlan_id: 20 + state: suspend + state: merged + + # After state: + # ------------ + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 10 + # name ten + # ! + # vlan 20 + # name twenty + # state suspend + + + # Using overridden + + # Before state: + # ------------- + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 10 + # name ten + # ! + # vlan 20 + # name twenty + + - name: Override device configuration of all VLANs with provided configuration + arista.eos.eos_vlans: + config: + - vlan_id: 20 + state: suspend + state: overridden + + # After state: + # ------------ + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 20 + # state suspend + + + # Using replaced + + # Before state: + # ------------- + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 10 + # name ten + # ! + # vlan 20 + # name twenty + + - name: Replace all attributes of specified VLANs with provided configuration + arista.eos.eos_vlans: + config: + - vlan_id: 20 + state: suspend + state: replaced + + # After state: + # ------------ + # + # veos(config-vlan-20)#show running-config | section vlan + # vlan 10 + # name ten + # ! + # vlan 20 + # state suspend + + # using parsed + + # parsed.cfg + # vlan 10 + # name ten + # ! + # vlan 20 + # name twenty + # state suspend + + - name: Use parsed to convert native configs to structured data + arista.eos.eos_vlans: + running_config: "{{ lookup('file', 'parsed.cfg') }}" + state: parsed + + # Output: + # ------- + # parsed: + # - vlan_id: 10 + # name: ten + # - vlan_id: 20 + # state: suspend + + # Using rendered: + + - name: Use Rendered to convert the structured data to native config + arista.eos.eos_vlans: + config: + - vlan_id: 10 + name: ten + - vlan_id: 20 + state: suspend + state: rendered + + # Output: + # ------ + # rendered: + # - "vlan 10" + # - "name ten" + # - "vlan 20" + # - "state suspend" + + # Using gathered: + # native_config: + # vlan 10 + # name ten + # ! + # vlan 20 + # name twenty + # state suspend + + - name: Gather vlans facts from the device + arista.eos.eos_vlans: + state: gathered + + # Output: + # ------ + + # gathered: + # - vlan_id: 10 + # name: ten + # - vlan_id: 20 + # state: suspend + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + +
KeyReturnedDescription
+
+ after + +
+ list +
+
when changed +
The configuration as structured data after module completion.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ before + +
+ list +
+
always +
The configuration as structured data prior to module invocation.
+
+
Sample:
+
The configuration returned will always be in the same format + of the parameters above.
+
+
+ commands + +
+ list +
+
always +
The set of commands pushed to the remote device.
+
+
Sample:
+
['vlan 10', 'no name', 'vlan 11', 'name Eleven']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Nathaniel Case (@qalthos) diff --git a/ansible_collections/arista/eos/docs/arista.eos.eos_vrf_module.rst b/ansible_collections/arista/eos/docs/arista.eos.eos_vrf_module.rst new file mode 100644 index 000000000..dcde6db71 --- /dev/null +++ b/ansible_collections/arista/eos/docs/arista.eos.eos_vrf_module.rst @@ -0,0 +1,364 @@ +.. _arista.eos.eos_vrf_module: + + +****************** +arista.eos.eos_vrf +****************** + +**Manage VRFs on Arista EOS network devices** + + +Version added: 1.0.0 + +.. contents:: + :local: + :depth: 1 + + +Synopsis +-------- +- This module provides declarative management of VRFs on Arista EOS network devices. + + + + +Parameters +---------- + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterChoices/DefaultsComments
+
+ aggregate + +
+ list + / elements=dictionary +
+
+ +
List of VRFs instances
+
+
+ associated_interfaces + +
+ list + / elements=string +
+
+ +
This is a intent option and checks the operational state of the for given vrf name for associated interfaces. If the value in the associated_interfaces does not match with the operational state of vrf interfaces on device it will result in failure.
+
+
+ delay + +
+ integer +
+
+ Default:
10
+
+
Time in seconds to wait before checking for the operational state on remote device. This wait is applicable for operational state arguments.
+
+
+ interfaces + +
+ list + / elements=string +
+
+ +
Identifies the set of interfaces that should be configured in the VRF. Interfaces must be routed interfaces in order to be placed into a VRF. The name of interface should be in expanded format and not abbreviated.
+
+
+ name + +
+ string + / required +
+
+ +
Name of the VRF.
+
+
+ rd + +
+ string +
+
+ +
Route distinguisher of the VRF
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the VRF configuration.
+
+
+ associated_interfaces + +
+ list + / elements=string +
+
+ +
This is a intent option and checks the operational state of the for given vrf name for associated interfaces. If the value in the associated_interfaces does not match with the operational state of vrf interfaces on device it will result in failure.
+
+
+ delay + +
+ integer +
+
+ Default:
10
+
+
Time in seconds to wait before checking for the operational state on remote device. This wait is applicable for operational state arguments.
+
+
+ interfaces + +
+ list + / elements=string +
+
+ +
Identifies the set of interfaces that should be configured in the VRF. Interfaces must be routed interfaces in order to be placed into a VRF. The name of interface should be in expanded format and not abbreviated.
+
+
+ name + +
+ string +
+
+ +
Name of the VRF.
+
+
+ purge + +
+ boolean +
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Purge VRFs not defined in the aggregate parameter.
+
+
+ rd + +
+ string +
+
+ +
Route distinguisher of the VRF
+
+
+ state + +
+ string +
+
+
    Choices: +
  • present ←
  • +
  • absent
  • +
+
+
State of the VRF configuration.
+
+
+ + +Notes +----- + +.. note:: + - Tested against Arista EOS 4.24.6F + + + +Examples +-------- + +.. code-block:: yaml + + - name: Create vrf + arista.eos.eos_vrf: + name: test + rd: 1:200 + interfaces: + - Ethernet2 + state: present + + - name: Delete VRFs + arista.eos.eos_vrf: + name: test + state: absent + + - name: Create aggregate of VRFs with purge + arista.eos.eos_vrf: + aggregate: + - name: test4 + rd: 1:204 + - name: test5 + rd: 1:205 + state: present + purge: yes + + - name: Delete aggregate of VRFs + arista.eos.eos_vrf: + aggregate: + - name: test2 + - name: test3 + - name: test4 + - name: test5 + state: absent + + + +Return Values +------------- +Common return values are documented `here `_, the following are the fields unique to this module: + +.. raw:: html + + + + + + + + + + + + +
KeyReturnedDescription
+
+ commands + +
+ list +
+
always +
The list of configuration mode commands to send to the device
+
+
Sample:
+
['vrf instance test', 'rd 1:100', 'interface Ethernet1', 'vrf test']
+
+

+ + +Status +------ + + +Authors +~~~~~~~ + +- Ricardo Carrillo Cruz (@rcarrillocruz) diff --git a/ansible_collections/arista/eos/ignore-2.9.txt b/ansible_collections/arista/eos/ignore-2.9.txt new file mode 100644 index 000000000..dd36b8936 --- /dev/null +++ b/ansible_collections/arista/eos/ignore-2.9.txt @@ -0,0 +1,136 @@ +plugins/module_utils/network/eos/providers/cli/config/bgp/address_family.py future-import-boilerplate +plugins/module_utils/network/eos/providers/cli/config/bgp/address_family.py metaclass-boilerplate +plugins/module_utils/network/eos/providers/cli/config/bgp/neighbors.py future-import-boilerplate +plugins/module_utils/network/eos/providers/cli/config/bgp/neighbors.py metaclass-boilerplate +plugins/module_utils/network/eos/providers/cli/config/bgp/process.py future-import-boilerplate +plugins/module_utils/network/eos/providers/cli/config/bgp/process.py metaclass-boilerplate +plugins/module_utils/network/eos/providers/module.py future-import-boilerplate +plugins/module_utils/network/eos/providers/module.py metaclass-boilerplate +plugins/module_utils/network/eos/providers/providers.py future-import-boilerplate +plugins/module_utils/network/eos/providers/providers.py metaclass-boilerplate +plugins/modules/eos_banner.py future-import-boilerplate +plugins/modules/eos_banner.py metaclass-boilerplate +plugins/modules/eos_banner.py validate-modules:doc-missing-type +plugins/modules/eos_banner.py validate-modules:doc-required-mismatch +plugins/modules/eos_bgp.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_bgp.py validate-modules:doc-elements-mismatch +plugins/modules/eos_bgp.py validate-modules:doc-missing-type +plugins/modules/eos_bgp.py validate-modules:doc-type-does-not-match-spec +plugins/modules/eos_bgp.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/eos_bgp.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_command.py future-import-boilerplate +plugins/modules/eos_command.py metaclass-boilerplate +plugins/modules/eos_command.py validate-modules:doc-missing-type +plugins/modules/eos_command.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_command.py validate-modules:doc-required-mismatch +plugins/modules/eos_command.py validate-modules:parameter-list-no-elements +plugins/modules/eos_config.py future-import-boilerplate +plugins/modules/eos_config.py metaclass-boilerplate +plugins/modules/eos_config.py validate-modules:doc-missing-type +plugins/modules/eos_config.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_config.py validate-modules:doc-required-mismatch +plugins/modules/eos_config.py validate-modules:parameter-list-no-elements +plugins/modules/eos_eapi.py future-import-boilerplate +plugins/modules/eos_eapi.py metaclass-boilerplate +plugins/modules/eos_eapi.py validate-modules:doc-default-does-not-match-spec +plugins/modules/eos_eapi.py validate-modules:doc-missing-type +plugins/modules/eos_eapi.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_eapi.py validate-modules:doc-required-mismatch +plugins/modules/eos_lldp.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_lldp.py validate-modules:doc-missing-type +plugins/modules/eos_lldp.py validate-modules:doc-required-mismatch +plugins/modules/eos_logging.py future-import-boilerplate +plugins/modules/eos_logging.py metaclass-boilerplate +plugins/modules/eos_logging.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_logging.py validate-modules:doc-elements-mismatch +plugins/modules/eos_logging.py validate-modules:doc-missing-type +plugins/modules/eos_logging.py validate-modules:missing-suboption-docs +plugins/modules/eos_logging.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_logging.py validate-modules:undocumented-parameter +plugins/modules/eos_logging.py validate-modules:doc-required-mismatch +plugins/modules/eos_system.py future-import-boilerplate +plugins/modules/eos_system.py metaclass-boilerplate +plugins/modules/eos_system.py validate-modules:doc-missing-type +plugins/modules/eos_system.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_system.py validate-modules:doc-required-mismatch +plugins/modules/eos_system.py validate-modules:parameter-list-no-elements +plugins/modules/eos_user.py future-import-boilerplate +plugins/modules/eos_user.py metaclass-boilerplate +plugins/modules/eos_user.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_user.py validate-modules:doc-elements-mismatch +plugins/modules/eos_user.py validate-modules:doc-missing-type +plugins/modules/eos_user.py validate-modules:missing-suboption-docs +plugins/modules/eos_user.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_user.py validate-modules:undocumented-parameter +plugins/modules/eos_user.py validate-modules:doc-required-mismatch +plugins/modules/eos_vrf.py future-import-boilerplate +plugins/modules/eos_vrf.py metaclass-boilerplate +plugins/modules/eos_vrf.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_vrf.py validate-modules:doc-elements-mismatch +plugins/modules/eos_vrf.py validate-modules:doc-missing-type +plugins/modules/eos_vrf.py validate-modules:missing-suboption-docs +plugins/modules/eos_vrf.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_vrf.py validate-modules:undocumented-parameter +plugins/modules/eos_vrf.py validate-modules:doc-required-mismatch +plugins/modules/eos_vrf.py validate-modules:parameter-list-no-elements +plugins/modules/eos_interface.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_interface.py validate-modules:doc-missing-type +plugins/modules/eos_interface.py validate-modules:missing-suboption-docs +plugins/modules/eos_interface.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_interface.py validate-modules:undocumented-parameter +plugins/modules/eos_interface.py validate-modules:doc-required-mismatch +plugins/modules/eos_interface.py validate-modules:doc-elements-mismatch +plugins/modules/eos_vlan.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_vlan.py validate-modules:doc-missing-type +plugins/modules/eos_vlan.py validate-modules:missing-suboption-docs +plugins/modules/eos_vlan.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_vlan.py validate-modules:undocumented-parameter +plugins/modules/eos_vlan.py validate-modules:doc-required-mismatch +plugins/modules/eos_vlan.py validate-modules:parameter-list-no-elements +plugins/modules/eos_vlan.py validate-modules:doc-elements-mismatch +plugins/modules/eos_l3_interface.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_l3_interface.py validate-modules:doc-missing-type +plugins/modules/eos_l3_interface.py validate-modules:missing-suboption-docs +plugins/modules/eos_l3_interface.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_l3_interface.py validate-modules:undocumented-parameter +plugins/modules/eos_l3_interface.py validate-modules:doc-required-mismatch +plugins/modules/eos_l3_interface.py validate-modules:doc-elements-mismatch +plugins/modules/eos_l2_interface.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_l2_interface.py validate-modules:doc-missing-type +plugins/modules/eos_l2_interface.py validate-modules:missing-suboption-docs +plugins/modules/eos_l2_interface.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_l2_interface.py validate-modules:undocumented-parameter +plugins/modules/eos_l2_interface.py validate-modules:doc-required-mismatch +plugins/modules/eos_l2_interface.py validate-modules:doc-elements-mismatch +plugins/modules/eos_linkagg.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_linkagg.py validate-modules:doc-missing-type +plugins/modules/eos_linkagg.py validate-modules:missing-suboption-docs +plugins/modules/eos_linkagg.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_linkagg.py validate-modules:undocumented-parameter +plugins/modules/eos_linkagg.py validate-modules:doc-required-mismatch +plugins/modules/eos_linkagg.py validate-modules:parameter-list-no-elements +plugins/modules/eos_linkagg.py validate-modules:doc-elements-mismatch +plugins/modules/eos_static_route.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/eos_static_route.py validate-modules:doc-missing-type +plugins/modules/eos_static_route.py validate-modules:missing-suboption-docs +plugins/modules/eos_static_route.py validate-modules:parameter-type-not-in-doc +plugins/modules/eos_static_route.py validate-modules:undocumented-parameter +plugins/modules/eos_static_route.py validate-modules:doc-required-mismatch +plugins/modules/eos_static_route.py validate-modules:doc-elements-mismatch +plugins/modules/eos_interfaces.py validate-modules:doc-elements-mismatch +plugins/modules/eos_interfaces.py validate-modules:parameter-list-no-elements +plugins/modules/eos_facts.py validate-modules:doc-required-mismatch +plugins/modules/eos_facts.py validate-modules:parameter-list-no-elements +plugins/action/eos.py action-plugin-docs # base class for deprecated network platform modules using `connection: local` +plugins/doc_fragments/eos.py future-import-boilerplate +plugins/doc_fragments/eos.py metaclass-boilerplate +plugins/module_utils/network/eos/eos.py future-import-boilerplate +plugins/module_utils/network/eos/eos.py metaclass-boilerplate +tests/unit/mock/path.py future-import-boilerplate +tests/unit/mock/path.py metaclass-boilerplate +tests/unit/mock/yaml_helper.py future-import-boilerplate +tests/unit/mock/yaml_helper.py metaclass-boilerplate +tests/unit/modules/conftest.py future-import-boilerplate +tests/unit/modules/conftest.py metaclass-boilerplate +tests/unit/modules/utils.py future-import-boilerplate +tests/unit/modules/utils.py metaclass-boilerplate diff --git a/ansible_collections/arista/eos/meta/runtime.yml b/ansible_collections/arista/eos/meta/runtime.yml new file mode 100644 index 000000000..e297849f5 --- /dev/null +++ b/ansible_collections/arista/eos/meta/runtime.yml @@ -0,0 +1,86 @@ +--- +requires_ansible: ">=2.9.10" +plugin_routing: + modules: + acl_interfaces: + redirect: arista.eos.eos_acl_interfaces + acls: + redirect: arista.eos.eos_acls + banner: + redirect: arista.eos.eos_banner + bgp: + redirect: arista.eos.eos_bgp + deprecation: + removal_date: "2023-01-01" + warning_text: See the plugin documentation for more details + eos_bgp: + deprecation: + removal_date: "2023-01-01" + warning_text: See the plugin documentation for more details + bgp_address_family: + redirect: arista.eos.eos_bgp_address_family + bgp_global: + redirect: arista.eos.eos_bgp_global + command: + redirect: arista.eos.eos_command + config: + redirect: arista.eos.eos_config + eapi: + redirect: arista.eos.eos_eapi + facts: + redirect: arista.eos.eos_facts + hostname: + redirect: arista.eos.eos_hostname + interfaces: + redirect: arista.eos.eos_interfaces + l2_interfaces: + redirect: arista.eos.eos_l2_interfaces + l3_interfaces: + redirect: arista.eos.eos_l3_interfaces + lacp: + redirect: arista.eos.eos_lacp + lacp_interfaces: + redirect: arista.eos.eos_lacp_interfaces + lag_interfaces: + redirect: arista.eos.eos_lag_interfaces + lldp: + redirect: arista.eos.eos_lldp + lldp_global: + redirect: arista.eos.eos_lldp_global + lldp_interfaces: + redirect: arista.eos.eos_lldp_interfaces + logging: + redirect: arista.eos.eos_logging + deprecation: + removal_date: "2024-01-01" + warning_text: See the plugin documentation for more details + eos_logging: + deprecation: + removal_date: "2024-01-01" + warning_text: See the plugin documentation for more details + logging_global: + redirect: arista.eos.eos_logging_global + ntp_global: + redirect: arista.eos.eos_ntp_global + ospfv2: + redirect: arista.eos.eos_ospfv2 + ospfv3: + redirect: arista.eos.eos_ospfv3 + ospf_interfaces: + redirect: arista.eos.eos_ospf_interfaces + prefix_lists: + redirect: arista.eos.eos_prefix_lists + route_maps: + redirect: arista.eos.eos_route_maps + snmp_server: + redirect: arista.eos.eos_snmp_server + static_routes: + redirect: arista.eos.eos_static_routes + system: + redirect: arista.eos.eos_system + user: + redirect: arista.eos.eos_user + vlans: + redirect: arista.eos.eos_vlans + vrf: + redirect: arista.eos.eos_vrf diff --git a/ansible_collections/arista/eos/plugins/action/__init__.py b/ansible_collections/arista/eos/plugins/action/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/action/acl_interfaces.py b/ansible_collections/arista/eos/plugins/action/acl_interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/acl_interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/acls.py b/ansible_collections/arista/eos/plugins/action/acls.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/acls.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/banner.py b/ansible_collections/arista/eos/plugins/action/banner.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/banner.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/bgp.py b/ansible_collections/arista/eos/plugins/action/bgp.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/bgp.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/bgp_address_family.py b/ansible_collections/arista/eos/plugins/action/bgp_address_family.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/bgp_address_family.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/bgp_global.py b/ansible_collections/arista/eos/plugins/action/bgp_global.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/bgp_global.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/command.py b/ansible_collections/arista/eos/plugins/action/command.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/command.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/config.py b/ansible_collections/arista/eos/plugins/action/config.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/config.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/eapi.py b/ansible_collections/arista/eos/plugins/action/eapi.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/eapi.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/eos.py b/ansible_collections/arista/eos/plugins/action/eos.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/eos.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/facts.py b/ansible_collections/arista/eos/plugins/action/facts.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/facts.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/hostname.py b/ansible_collections/arista/eos/plugins/action/hostname.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/hostname.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/interface.py b/ansible_collections/arista/eos/plugins/action/interface.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/interface.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/interfaces.py b/ansible_collections/arista/eos/plugins/action/interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/l2_interface.py b/ansible_collections/arista/eos/plugins/action/l2_interface.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/l2_interface.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/l2_interfaces.py b/ansible_collections/arista/eos/plugins/action/l2_interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/l2_interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/l3_interface.py b/ansible_collections/arista/eos/plugins/action/l3_interface.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/l3_interface.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/l3_interfaces.py b/ansible_collections/arista/eos/plugins/action/l3_interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/l3_interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/lacp.py b/ansible_collections/arista/eos/plugins/action/lacp.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/lacp.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/lacp_interfaces.py b/ansible_collections/arista/eos/plugins/action/lacp_interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/lacp_interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/lag_interfaces.py b/ansible_collections/arista/eos/plugins/action/lag_interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/lag_interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/linkagg.py b/ansible_collections/arista/eos/plugins/action/linkagg.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/linkagg.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/lldp.py b/ansible_collections/arista/eos/plugins/action/lldp.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/lldp.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/lldp_global.py b/ansible_collections/arista/eos/plugins/action/lldp_global.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/lldp_global.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/lldp_interfaces.py b/ansible_collections/arista/eos/plugins/action/lldp_interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/lldp_interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/logging.py b/ansible_collections/arista/eos/plugins/action/logging.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/logging.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/logging_global.py b/ansible_collections/arista/eos/plugins/action/logging_global.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/logging_global.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/ntp_global.py b/ansible_collections/arista/eos/plugins/action/ntp_global.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/ntp_global.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/ospf_interfaces.py b/ansible_collections/arista/eos/plugins/action/ospf_interfaces.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/ospf_interfaces.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/ospfv2.py b/ansible_collections/arista/eos/plugins/action/ospfv2.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/ospfv2.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/ospfv3.py b/ansible_collections/arista/eos/plugins/action/ospfv3.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/ospfv3.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/prefix_lists.py b/ansible_collections/arista/eos/plugins/action/prefix_lists.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/prefix_lists.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/route_maps.py b/ansible_collections/arista/eos/plugins/action/route_maps.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/route_maps.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/snmp_server.py b/ansible_collections/arista/eos/plugins/action/snmp_server.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/snmp_server.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/static_route.py b/ansible_collections/arista/eos/plugins/action/static_route.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/static_route.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/static_routes.py b/ansible_collections/arista/eos/plugins/action/static_routes.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/static_routes.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/system.py b/ansible_collections/arista/eos/plugins/action/system.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/system.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/user.py b/ansible_collections/arista/eos/plugins/action/user.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/user.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/vlan.py b/ansible_collections/arista/eos/plugins/action/vlan.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/vlan.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/vlans.py b/ansible_collections/arista/eos/plugins/action/vlans.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/vlans.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/action/vrf.py b/ansible_collections/arista/eos/plugins/action/vrf.py new file mode 100644 index 000000000..0afb7e88f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/action/vrf.py @@ -0,0 +1,58 @@ +# +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible.utils.display import Display +from ansible_collections.ansible.netcommon.plugins.action.network import ( + ActionModule as ActionNetworkModule, +) + + +display = Display() + + +class ActionModule(ActionNetworkModule): + def run(self, tmp=None, task_vars=None): + del tmp # tmp no longer has any effect + + module_name = self._task.action.split(".")[-1] + self._config_module = ( + True if module_name in ["eos_config", "config"] else False + ) + persistent_connection = self._play_context.connection.split(".")[-1] + warnings = [] + + if persistent_connection not in ("network_cli", "httpapi"): + return { + "failed": True, + "msg": "Connection type %s is not valid for this module" + % self._play_context.connection, + } + + result = super(ActionModule, self).run(task_vars=task_vars) + if warnings: + if "warnings" in result: + result["warnings"].extend(warnings) + else: + result["warnings"] = warnings + return result diff --git a/ansible_collections/arista/eos/plugins/cliconf/__init__.py b/ansible_collections/arista/eos/plugins/cliconf/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/cliconf/eos.py b/ansible_collections/arista/eos/plugins/cliconf/eos.py new file mode 100644 index 000000000..d5347307d --- /dev/null +++ b/ansible_collections/arista/eos/plugins/cliconf/eos.py @@ -0,0 +1,494 @@ +# +# (c) 2017 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +DOCUMENTATION = """ +author: Ansible Networking Team (@ansible-network) +name: eos +short_description: Use eos cliconf to run command on Arista EOS platform +description: +- This eos plugin provides low level abstraction apis for sending and receiving CLI + commands from Arista EOS network devices. +version_added: 1.0.0 +options: + eos_use_sessions: + type: boolean + default: true + description: + - Specifies if sessions should be used on remote host or not + env: + - name: ANSIBLE_EOS_USE_SESSIONS + vars: + - name: ansible_eos_use_sessions + config_commands: + description: + - Specifies a list of commands that can make configuration changes + to the target device. + - When `ansible_network_single_user_mode` is enabled, if a command sent + to the device is present in this list, the existing cache is invalidated. + version_added: 2.0.0 + type: list + elements: str + default: [] + vars: + - name: ansible_eos_config_commands +""" + +import json +import re + +from ansible.errors import AnsibleConnectionFailure +from ansible.module_utils._text import to_text +from ansible.module_utils.common._collections_compat import Mapping +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + NetworkConfig, + dumps, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, +) +from ansible_collections.ansible.netcommon.plugins.plugin_utils.cliconf_base import ( + CliconfBase, + enable_mode, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.eos import ( + session_name, +) + + +class Cliconf(CliconfBase): + __rpc__ = CliconfBase.__rpc__ + [ + "commit", + "discard_changes", + "get_diff", + "run_commands", + "supports_sessions", + ] + + def __init__(self, *args, **kwargs): + super(Cliconf, self).__init__(*args, **kwargs) + self._device_info = {} + self._session_support = None + + @enable_mode + def get_config(self, source="running", flags=None, format="text"): + options_values = self.get_option_values() + if format not in options_values["format"]: + raise ValueError( + "'format' value %s is invalid. Valid values are %s" + % (format, ",".join(options_values["format"])), + ) + + lookup = {"running": "running-config", "startup": "startup-config"} + if source not in lookup: + raise ValueError( + "fetching configuration from %s is not supported" % source, + ) + + cmd = "show %s " % lookup[source] + if format and format != "text": + cmd += "| %s " % format + + cmd += " ".join(to_list(flags)) + cmd = cmd.strip() + return self.send_command(cmd) + + @enable_mode + def get_session_config( + self, + candidate=None, + commit=True, + replace=None, + comment=None, + ): + operations = self.get_device_operations() + self.check_edit_config_capability( + operations, + candidate, + commit, + replace, + comment, + ) + + if (commit is False) and (not self.supports_sessions()): + raise ValueError( + "check mode is not supported without configuration session", + ) + + resp = {} + session = None + if self.supports_sessions(): + session = session_name() + resp.update({"session": session}) + self.send_command("configure session %s" % session) + if replace: + self.send_command("rollback clean-config") + else: + self.send_command("configure") + + results = [] + requests = [] + multiline = False + for line in to_list(candidate): + if not isinstance(line, Mapping): + line = {"command": line} + + cmd = line["command"] + if cmd == "end": + continue + if cmd.startswith("banner") or multiline: + multiline = True + elif cmd == "EOF" and multiline: + multiline = False + + if multiline: + line["sendonly"] = True + + if cmd != "end" and not cmd.startswith("!"): + try: + results.append(self.send_command(**line)) + requests.append(cmd) + except AnsibleConnectionFailure as e: + self.discard_changes(session) + raise AnsibleConnectionFailure(e.message) + + resp["request"] = requests + resp["response"] = results + if self.supports_sessions(): + out = self.send_command("show session-config") + if out: + resp["diff"] = out.strip() + + if commit: + self.commit() + else: + self.discard_changes(session) + else: + self.send_command("end") + if resp.get("diff"): + return resp["diff"] + return resp + + @enable_mode + def edit_config( + self, + candidate=None, + commit=True, + replace=None, + comment=None, + ): + operations = self.get_device_operations() + self.check_edit_config_capability( + operations, + candidate, + commit, + replace, + comment, + ) + + if (commit is False) and (not self.supports_sessions()): + raise ValueError( + "check mode is not supported without configuration session", + ) + + resp = {} + session = None + if self.supports_sessions(): + session = session_name() + resp.update({"session": session}) + self.send_command("configure session %s" % session) + if replace: + self.send_command("rollback clean-config") + else: + self.send_command("configure") + + results = [] + requests = [] + multiline = False + for line in to_list(candidate): + if not isinstance(line, Mapping): + line = {"command": line} + + cmd = line["command"] + if cmd == "end": + continue + if cmd.startswith("banner") or multiline: + multiline = True + elif cmd == "EOF" and multiline: + multiline = False + + if multiline: + line["sendonly"] = True + + if cmd != "end" and not cmd.startswith("!"): + try: + results.append(self.send_command(**line)) + requests.append(cmd) + except AnsibleConnectionFailure as e: + self.discard_changes(session) + raise AnsibleConnectionFailure(e.message) + + resp["request"] = requests + resp["response"] = results + if self.supports_sessions(): + out = self.send_command("show session-config diffs") + if out: + resp["diff"] = out.strip() + + if commit: + self.commit() + else: + self.discard_changes(session) + else: + self.send_command("end") + return resp + + def get( + self, + command, + prompt=None, + answer=None, + sendonly=False, + newline=True, + output=None, + check_all=False, + version=None, + ): + if output: + command = self._get_command_with_output(command, output, version) + return self.send_command( + command=command, + prompt=prompt, + answer=answer, + sendonly=sendonly, + newline=newline, + check_all=check_all, + ) + + def commit(self): + self.send_command("commit") + + def discard_changes(self, session=None): + commands = ["end"] + if self.supports_sessions(): + # to close session gracefully execute abort in top level session prompt. + commands.extend(["configure session %s" % session, "abort"]) + + for cmd in commands: + self.send_command(cmd) + + def run_commands(self, commands=None, check_rc=True): + if commands is None: + raise ValueError("'commands' value is required") + responses = list() + for cmd in to_list(commands): + if not isinstance(cmd, Mapping): + cmd = {"command": cmd} + + output = cmd.pop("output", None) + version = cmd.pop("version", None) + if output: + cmd["command"] = self._get_command_with_output( + cmd["command"], + output, + version, + ) + + try: + out = self.send_command(**cmd) + except AnsibleConnectionFailure as e: + if check_rc: + raise + out = getattr(e, "err", e) + out = to_text(out, errors="surrogate_or_strict") + + if out is not None: + try: + out = json.loads(out) + except ValueError: + out = out.strip() + + responses.append(out) + return responses + + def get_diff( + self, + candidate=None, + running=None, + diff_match="line", + diff_ignore_lines=None, + path=None, + diff_replace="line", + ): + diff = {} + device_operations = self.get_device_operations() + option_values = self.get_option_values() + + if candidate is None and device_operations["supports_generate_diff"]: + raise ValueError( + "candidate configuration is required to generate diff", + ) + + if diff_match not in option_values["diff_match"]: + raise ValueError( + "'match' value %s in invalid, valid values are %s" + % (diff_match, ", ".join(option_values["diff_match"])), + ) + + if diff_replace not in option_values["diff_replace"]: + raise ValueError( + "'replace' value %s in invalid, valid values are %s" + % (diff_replace, ", ".join(option_values["diff_replace"])), + ) + + # prepare candidate configuration + candidate_obj = NetworkConfig(indent=3) + candidate_obj.load(candidate) + + if running and diff_match != "none" and diff_replace != "config": + # running configuration + running_obj = NetworkConfig( + indent=3, + contents=running, + ignore_lines=diff_ignore_lines, + ) + configdiffobjs = candidate_obj.difference( + running_obj, + path=path, + match=diff_match, + replace=diff_replace, + ) + + else: + configdiffobjs = candidate_obj.items + + diff["config_diff"] = ( + dumps(configdiffobjs, "commands") if configdiffobjs else "" + ) + return diff + + def supports_sessions(self): + if not self.get_option("eos_use_sessions"): + self._session_support = False + else: + if self._session_support: + return self._session_support + + try: + self.get("show configuration sessions") + self._session_support = True + except AnsibleConnectionFailure: + self._session_support = False + + return self._session_support + + def get_device_info(self): + if not self._device_info: + device_info = {} + + device_info["network_os"] = "eos" + reply = self.get("show version | json") + data = json.loads(reply) + + device_info["network_os_version"] = data["version"] + device_info["network_os_model"] = data["modelName"] + + reply = self.get("show hostname | json") + data = json.loads(reply) + + device_info["network_os_hostname"] = data["hostname"] + + try: + reply = self.get("bash timeout 5 cat /mnt/flash/boot-config") + + match = re.search(r"SWI=(.+)$", reply, re.M) + if match: + device_info["network_os_image"] = match.group(1) + except AnsibleConnectionFailure: + # This requires enable mode to run + self._connection.queue_message( + "vvv", + "Unable to gather network_os_image without enable mode", + ) + + self._device_info = device_info + + return self._device_info + + def get_device_operations(self): + return { + "supports_diff_replace": True, + "supports_commit": bool(self.supports_sessions()), + "supports_rollback": False, + "supports_defaults": False, + "supports_onbox_diff": bool(self.supports_sessions()), + "supports_commit_comment": False, + "supports_multiline_delimiter": False, + "supports_diff_match": True, + "supports_diff_ignore_lines": True, + "supports_generate_diff": not bool(self.supports_sessions()), + "supports_replace": bool(self.supports_sessions()), + } + + def get_option_values(self): + return { + "format": ["text", "json"], + "diff_match": ["line", "strict", "exact", "none"], + "diff_replace": ["line", "block", "config"], + "output": ["text", "json"], + } + + def get_capabilities(self): + result = super(Cliconf, self).get_capabilities() + result["device_operations"] = self.get_device_operations() + result.update(self.get_option_values()) + + return json.dumps(result) + + def set_cli_prompt_context(self): + """ + Make sure we are in the operational cli mode + :return: None + """ + if self._connection.connected: + self._update_cli_prompt_context( + config_context="(config", + exit_command="abort", + ) + + def _get_command_with_output(self, command, output, version): + options_values = self.get_option_values() + if output not in options_values["output"]: + raise ValueError( + "'output' value %s is invalid. Valid values are %s" + % (output, ",".join(options_values["output"])), + ) + + if output == "json" and not command.endswith("| json"): + cmd = "%s | json" % command + else: + cmd = command + if version != "latest" and "| json" in cmd: + cmd = "%s version %s" % (cmd, version) + return cmd diff --git a/ansible_collections/arista/eos/plugins/filter/__init__.py b/ansible_collections/arista/eos/plugins/filter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/httpapi/__init__.py b/ansible_collections/arista/eos/plugins/httpapi/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/httpapi/eos.py b/ansible_collections/arista/eos/plugins/httpapi/eos.py new file mode 100644 index 000000000..9fa9dfd3e --- /dev/null +++ b/ansible_collections/arista/eos/plugins/httpapi/eos.py @@ -0,0 +1,217 @@ +# (c) 2018 Red Hat Inc. +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +DOCUMENTATION = """ +author: Ansible Networking Team (@ansible-network) +name: eos +short_description: Use eAPI to run command on eos platform +description: +- This eos plugin provides low level abstraction api's for sending and receiving CLI + commands with eos network devices. +version_added: 1.0.0 +options: + eos_use_sessions: + type: bool + default: yes + description: + - Specifies if sessions should be used on remote host or not + env: + - name: ANSIBLE_EOS_USE_SESSIONS + vars: + - name: ansible_eos_use_sessions +""" + +import json + +from ansible.errors import AnsibleConnectionFailure +from ansible.module_utils._text import to_text +from ansible.module_utils.connection import ConnectionError +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, +) +from ansible_collections.ansible.netcommon.plugins.plugin_utils.httpapi_base import ( + HttpApiBase, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.eos import ( + session_name, +) + + +OPTIONS = { + "format": ["text", "json"], + "diff_match": ["line", "strict", "exact", "none"], + "diff_replace": ["line", "block", "config"], + "output": ["text", "json"], +} + + +class HttpApi(HttpApiBase): + def __init__(self, *args, **kwargs): + super(HttpApi, self).__init__(*args, **kwargs) + self._device_info = None + self._session_support = None + + def supports_sessions(self): + if not self.get_option("eos_use_sessions"): + self._session_support = False + else: + if self._session_support: + return self._session_support + + try: + response = self.send_request("show configuration sessions") + self._session_support = "error" not in response + except AnsibleConnectionFailure: + self._session_support = False + + return self._session_support + + def send_request(self, data, **message_kwargs): + data = to_list(data) + become = self._become + if become: + self.connection.queue_message("vvvv", "firing event: on_become") + data.insert(0, {"cmd": "enable", "input": self._become_pass}) + + output = message_kwargs.get("output") or "text" + version = message_kwargs.get("version") or "latest" + request = request_builder(data, output, version) + headers = {"Content-Type": "application/json-rpc"} + + _response, response_data = self.connection.send( + "/command-api", + request, + headers=headers, + method="POST", + ) + + try: + response_data = json.loads(to_text(response_data.getvalue())) + except ValueError: + raise ConnectionError( + "Response was not valid JSON, got {0}".format( + to_text(response_data.getvalue()), + ), + ) + + results = handle_response(response_data) + + if become: + results = results[1:] + if len(results) == 1: + results = results[0] + + return results + + def get_device_info(self): + if self._device_info: + return self._device_info + + device_info = {} + + device_info["network_os"] = "eos" + reply = self.send_request("show version", output="json") + data = json.loads(reply) + + device_info["network_os_version"] = data["version"] + device_info["network_os_model"] = data["modelName"] + + reply = self.send_request("show hostname", output="json") + data = json.loads(reply) + + device_info["network_os_hostname"] = data["hostname"] + + self._device_info = device_info + return self._device_info + + def get_device_operations(self): + return { + "supports_diff_replace": True, + "supports_commit": bool(self.supports_sessions()), + "supports_rollback": False, + "supports_defaults": False, + "supports_onbox_diff": bool(self.supports_sessions()), + "supports_commit_comment": False, + "supports_multiline_delimiter": False, + "supports_diff_match": True, + "supports_diff_ignore_lines": True, + "supports_generate_diff": not bool(self.supports_sessions()), + "supports_replace": bool(self.supports_sessions()), + } + + def get_capabilities(self): + result = {} + result["rpc"] = [] + result["device_info"] = self.get_device_info() + result["device_operations"] = self.get_device_operations() + result.update(OPTIONS) + result["network_api"] = "eapi" + + return json.dumps(result) + + # Shims for resource module support + def get(self, command, output=None): + # This method is ONLY here to support resource modules. Therefore most + # arguments are unsupported and not present. + + return self.send_request(data=command, output=output) + + def edit_config(self, candidate): + # This method is ONLY here to support resource modules. Therefore most + # arguments are unsupported and not present. + + session = None + if self.supports_sessions(): + session = session_name() + candidate = ["configure session %s" % session] + candidate + else: + candidate = ["configure"] + candidate + candidate.append("commit") + + try: + responses = self.send_request(candidate) + except ConnectionError: + if session: + self.send_request(["configure session %s" % session, "abort"]) + raise + + return [resp for resp in to_list(responses) if resp != "{}"] + + +def handle_response(response): + if "error" in response: + error = response["error"] + + error_text = [] + for data in error.get("data", []): + error_text.extend(data.get("errors", [])) + error_text = "\n".join(error_text) or error["message"] + + raise ConnectionError(error_text, code=error["code"]) + + results = [] + + for result in response["result"]: + if "messages" in result: + results.append(result["messages"][0]) + elif "output" in result: + results.append(result["output"].strip()) + else: + results.append(json.dumps(result)) + + return results + + +def request_builder(commands, output, version, reqid=None): + if version != "latest": + version = int(version) + params = dict(version=version, cmds=commands, format=output) + return json.dumps( + dict(jsonrpc="2.0", id=reqid, method="runCmds", params=params), + ) diff --git a/ansible_collections/arista/eos/plugins/inventory/__init__.py b/ansible_collections/arista/eos/plugins/inventory/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acl_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acl_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acl_interfaces/acl_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acl_interfaces/acl_interfaces.py new file mode 100644 index 000000000..f76152800 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acl_interfaces/acl_interfaces.py @@ -0,0 +1,85 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# +""" +The arg spec for the eos_acl_interfaces module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class Acl_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_acl_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "access_groups": { + "elements": "dict", + "options": { + "acls": { + "elements": "dict", + "options": { + "direction": { + "required": True, + "choices": ["in", "out"], + "type": "str", + }, + "name": {"required": True, "type": "str"}, + }, + "type": "list", + }, + "afi": { + "required": True, + "choices": ["ipv4", "ipv6"], + "type": "str", + }, + }, + "type": "list", + }, + "name": {"required": True, "type": "str"}, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "parsed", + "rendered", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acls/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acls/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acls/acls.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acls/acls.py new file mode 100644 index 000000000..6f010fe9f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/acls/acls.py @@ -0,0 +1,416 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# +""" +The arg spec for the eos_acls module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class AclsArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_acls module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "acls": { + "elements": "dict", + "options": { + "aces": { + "elements": "dict", + "options": { + "destination": { + "mutually_exclusive": [ + [ + "address", + "subnet_address", + "any", + "host", + ], + [ + "wildcard_bits", + "subnet_address", + "any", + "host", + ], + ], + "options": { + "address": {"type": "str"}, + "any": {"type": "bool"}, + "host": {"type": "str"}, + "port_protocol": {"type": "dict"}, + "subnet_address": {"type": "str"}, + "wildcard_bits": {"type": "str"}, + }, + "required_together": [ + ["address", "wildcard_bits"], + ], + "type": "dict", + }, + "fragment_rules": {"type": "bool"}, + "fragments": {"type": "bool"}, + "grant": { + "choices": ["permit", "deny"], + "type": "str", + }, + "line": {"type": "str", "aliases": ["ace"]}, + "hop_limit": {"type": "dict"}, + "log": {"type": "bool"}, + "protocol": {"type": "str"}, + "protocol_options": { + "options": { + "icmp": { + "options": { + "administratively_prohibited": { + "type": "bool", + }, + "alternate_address": { + "type": "bool", + }, + "conversion_error": { + "type": "bool", + }, + "dod_host_prohibited": { + "type": "bool", + }, + "dod_net_prohibited": { + "type": "bool", + }, + "echo": {"type": "bool"}, + "echo_reply": {"type": "bool"}, + "general_parameter_problem": { + "type": "bool", + }, + "host_isolated": { + "type": "bool", + }, + "host_precedence_unreachable": { + "type": "bool", + }, + "host_redirect": { + "type": "bool", + }, + "host_tos_redirect": { + "type": "bool", + }, + "host_tos_unreachable": { + "type": "bool", + }, + "host_unknown": { + "type": "bool", + }, + "host_unreachable": { + "type": "bool", + }, + "information_reply": { + "type": "bool", + }, + "information_request": { + "type": "bool", + }, + "mask_reply": {"type": "bool"}, + "mask_request": { + "type": "bool", + }, + "message_code": { + "type": "int", + }, + "message_num": {"type": "int"}, + "message_type": { + "type": "int", + }, + "mobile_redirect": { + "type": "bool", + }, + "net_redirect": { + "type": "bool", + }, + "net_tos_redirect": { + "type": "bool", + }, + "net_tos_unreachable": { + "type": "bool", + }, + "net_unreachable": { + "type": "bool", + }, + "network_unknown": { + "type": "bool", + }, + "no_room_for_option": { + "type": "bool", + }, + "option_missing": { + "type": "bool", + }, + "packet_too_big": { + "type": "bool", + }, + "parameter_problem": { + "type": "bool", + }, + "port_unreachable": { + "type": "bool", + }, + "precedence_unreachable": { + "type": "bool", + }, + "protocol_unreachable": { + "type": "bool", + }, + "reassembly_timeout": { + "type": "bool", + }, + "redirect": {"type": "bool"}, + "router_advertisement": { + "type": "bool", + }, + "router_solicitation": { + "type": "bool", + }, + "source_quench": { + "type": "bool", + }, + "source_route_failed": { + "type": "bool", + }, + "time_exceeded": { + "type": "bool", + }, + "timestamp_reply": { + "type": "bool", + }, + "timestamp_request": { + "type": "bool", + }, + "traceroute": {"type": "bool"}, + "ttl_exceeded": { + "type": "bool", + }, + "unreachable": { + "type": "bool", + }, + }, + "type": "dict", + }, + "icmpv6": { + "options": { + "address_unreachable": { + "type": "bool", + }, + "beyond_scope": { + "type": "bool", + }, + "echo_reply": {"type": "bool"}, + "echo_request": { + "type": "bool", + }, + "erroneous_header": { + "type": "bool", + }, + "fragment_reassembly_exceeded": { + "type": "bool", + }, + "hop_limit_exceeded": { + "type": "bool", + }, + "neighbor_advertisement": { + "type": "bool", + }, + "neighbor_solicitation": { + "type": "bool", + }, + "no_admin": {"type": "bool"}, + "no_route": {"type": "bool"}, + "packet_too_big": { + "type": "bool", + }, + "parameter_problem": { + "type": "bool", + }, + "port_unreachable": { + "type": "bool", + }, + "redirect_message": { + "type": "bool", + }, + "reject_route": { + "type": "bool", + }, + "router_advertisement": { + "type": "bool", + }, + "router_solicitation": { + "type": "bool", + }, + "source_address_failed": { + "type": "bool", + }, + "source_routing_error": { + "type": "bool", + }, + "time_exceeded": { + "type": "bool", + }, + "unreachable": { + "type": "bool", + }, + "unrecognized_ipv6_option": { + "type": "bool", + }, + "unrecognized_next_header": { + "type": "bool", + }, + }, + "type": "dict", + }, + "ip": { + "options": { + "nexthop_group": { + "type": "str", + }, + }, + "type": "dict", + }, + "ipv6": { + "options": { + "nexthop_group": { + "type": "str", + }, + }, + "type": "dict", + }, + "tcp": { + "options": { + "flags": { + "options": { + "ack": { + "type": "bool", + }, + "established": { + "type": "bool", + }, + "fin": { + "type": "bool", + }, + "psh": { + "type": "bool", + }, + "rst": { + "type": "bool", + }, + "syn": { + "type": "bool", + }, + "urg": { + "type": "bool", + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "remark": {"type": "str"}, + "sequence": {"type": "int"}, + "source": { + "mutually_exclusive": [ + [ + "address", + "subnet_address", + "any", + "host", + ], + [ + "wildcard_bits", + "subnet_address", + "any", + "host", + ], + ], + "options": { + "address": {"type": "str"}, + "any": {"type": "bool"}, + "host": {"type": "str"}, + "port_protocol": {"type": "dict"}, + "subnet_address": {"type": "str"}, + "wildcard_bits": {"type": "str"}, + }, + "required_together": [ + ["address", "wildcard_bits"], + ], + "type": "dict", + }, + "tracked": {"type": "bool"}, + "ttl": { + "options": { + "eq": {"type": "int"}, + "gt": {"type": "int"}, + "lt": {"type": "int"}, + "neq": {"type": "int"}, + }, + "type": "dict", + }, + "vlan": {"type": "str"}, + }, + "type": "list", + }, + "name": {"required": True, "type": "str"}, + "standard": {"type": "bool"}, + }, + "type": "list", + }, + "afi": { + "choices": ["ipv4", "ipv6"], + "required": True, + "type": "str", + }, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_address_family/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_address_family/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_address_family/bgp_address_family.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_address_family/bgp_address_family.py new file mode 100644 index 000000000..c706afe18 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_address_family/bgp_address_family.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_bgp_address_family module +""" + + +class Bgp_afArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_bgp_address_family module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + }, + "config": { + "type": "dict", + "options": { + "as_number": {"type": "str"}, + "address_family": { + "elements": "dict", + "type": "list", + "options": { + "network": { + "type": "list", + "elements": "dict", + "options": { + "route_map": {"type": "str"}, + "address": {"type": "str"}, + }, + }, + "redistribute": { + "elements": "dict", + "type": "list", + "options": { + "ospf_route": { + "type": "str", + "choices": [ + "internal", + "external", + "nssa_external_1", + "nssa_external_2", + ], + }, + "route_map": {"type": "str"}, + "protocol": { + "type": "str", + "choices": ["isis", "ospfv3", "dhcp"], + }, + "isis_level": { + "type": "str", + "choices": [ + "level-1", + "level-2", + "level-1-2", + ], + }, + }, + }, + "route_target": { + "type": "dict", + "options": { + "action": { + "type": "str", + "choices": ["both", "import", "export"], + "aliases": ["mode"], + }, + "type": { + "type": "str", + "choices": [ + "evpn", + "vpn-ipv4", + "vpn-ipv6", + ], + }, + "route_map": {"type": "str"}, + "target": {"type": "str"}, + "imported_route": {"type": "bool"}, + }, + }, + "graceful_restart": {"type": "bool"}, + "bgp_params": { + "type": "dict", + "options": { + "next_hop_address_family": { + "type": "str", + "choices": ["ipv6"], + }, + "redistribute_internal": {"type": "bool"}, + "route": {"type": "str"}, + "additional_paths": { + "type": "str", + "choices": ["install", "send", "receive"], + }, + "next_hop_unchanged": {"type": "bool"}, + }, + }, + "safi": { + "type": "str", + "choices": ["labeled-unicast", "multicast"], + }, + "neighbor": { + "elements": "dict", + "type": "list", + "options": { + "activate": {"type": "bool"}, + "graceful_restart": {"type": "bool"}, + "weight": {"type": "int"}, + "default_originate": { + "type": "dict", + "options": { + "route_map": {"type": "str"}, + "always": {"type": "bool"}, + }, + }, + "route_map": { + "type": "dict", + "options": { + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + "name": {"type": "str"}, + }, + }, + "next_hop_address_family": { + "type": "str", + "choices": ["ipv6"], + }, + "additional_paths": { + "type": "str", + "choices": ["send", "receive"], + }, + "peer": {"type": "str"}, + "encapsulation": { + "type": "dict", + "options": { + "transport": { + "type": "str", + "choices": ["mpls", "vxlan"], + }, + "source_interface": {"type": "str"}, + }, + }, + "prefix_list": { + "type": "dict", + "options": { + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + "name": {"type": "str"}, + }, + }, + "next_hop_unchanged": {"type": "bool"}, + }, + }, + "afi": { + "type": "str", + "choices": ["ipv4", "ipv6", "evpn"], + }, + "vrf": {"type": "str"}, + }, + }, + }, + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_global/bgp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_global/bgp_global.py new file mode 100644 index 000000000..96a055e43 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/bgp_global/bgp_global.py @@ -0,0 +1,1033 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_bgp_global module +""" + + +class Bgp_globalArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_bgp_global module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "type": "str", + "choices": [ + "deleted", + "purged", + "merged", + "replaced", + "gathered", + "rendered", + "parsed", + ], + }, + "config": { + "type": "dict", + "options": { + "router_id": {"type": "str"}, + "as_number": {"type": "str"}, + "redistribute": { + "elements": "dict", + "type": "list", + "options": { + "ospf_route": { + "type": "str", + "choices": [ + "internal", + "external", + "nssa_external_1", + "nssa_external_2", + ], + }, + "route_map": {"type": "str"}, + "protocol": { + "type": "str", + "choices": [ + "isis", + "ospfv3", + "ospf", + "attached-host", + "connected", + "rip", + "static", + ], + }, + "isis_level": { + "type": "str", + "choices": ["level-1", "level-2", "level-1-2"], + }, + }, + }, + "monitoring": { + "type": "dict", + "options": { + "received": { + "type": "str", + "choices": ["post_policy", "pre_policy"], + }, + "station": {"type": "str"}, + "port": {"type": "int"}, + "timestamp": { + "type": "str", + "choices": ["none", "send_time"], + }, + }, + }, + "default_metric": {"type": "int"}, + "bgp_params": { + "type": "dict", + "options": { + "labeled_unicast": { + "type": "str", + "choices": ["ip", "tunnel"], + }, + "host_routes": {"type": "bool"}, + "transport": {"type": "int"}, + "next_hop_unchanged": {"type": "bool"}, + "missing_policy": { + "type": "dict", + "options": { + "action": { + "type": "str", + "choices": [ + "deny", + "permit", + "deny-in-out", + ], + }, + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + }, + }, + "monitoring": {"type": "bool"}, + "allowas_in": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + "additional_paths": { + "type": "str", + "choices": ["install", "send", "receive"], + }, + "advertise_inactive": {"type": "bool"}, + "listen": { + "type": "dict", + "options": { + "range": { + "type": "dict", + "options": { + "peer_group": { + "type": "dict", + "options": { + "peer_filter": {"type": "str"}, + "remote_as": {"type": "str"}, + "name": {"type": "str"}, + }, + }, + "address": {"type": "str"}, + }, + }, + "limit": {"type": "int"}, + }, + }, + "route_reflector": { + "type": "dict", + "options": { + "preserve": {"type": "bool"}, + "set": {"type": "bool"}, + }, + }, + "always_compare_med": {"type": "bool"}, + "client_to_client": {"type": "bool"}, + "bestpath": { + "type": "dict", + "options": { + "ecmp_fast": {"type": "bool"}, + "tie_break": { + "type": "str", + "choices": [ + "cluster_list_length", + "router_id", + ], + }, + "skip": {"type": "bool"}, + "as_path": { + "type": "str", + "choices": ["ignore", "multipath_relax"], + }, + "med": { + "type": "dict", + "options": { + "confed": {"type": "bool"}, + "missing_as_worst": {"type": "bool"}, + }, + }, + }, + }, + "convergence": { + "type": "dict", + "options": { + "slow_peer": {"type": "bool"}, + "time": {"type": "int"}, + }, + }, + "log_neighbor_changes": {"type": "bool"}, + "asn": { + "type": "str", + "choices": ["asdot", "asplain"], + }, + "default": { + "type": "str", + "choices": ["ipv4_unicast", "ipv6_unicast"], + }, + "route": {"type": "str"}, + "enforce_first_as": {"type": "bool"}, + "auto_local_addr": {"type": "bool"}, + "redistribute_internal": {"type": "bool"}, + "cluster_id": {"type": "str"}, + "control_plane_filter": {"type": "bool"}, + "confederation": { + "type": "dict", + "options": { + "peers": {"type": "str"}, + "identifier": {"type": "str"}, + }, + }, + }, + }, + "vlan": {"type": "int"}, + "update": { + "type": "dict", + "options": { + "wait_for": { + "type": "str", + "choices": [ + "wait_for_convergence", + "wait_install", + ], + }, + "batch_size": {"type": "int"}, + }, + }, + "vlan_aware_bundle": {"type": "str"}, + "aggregate_address": { + "elements": "dict", + "type": "list", + "options": { + "advertise_only": {"type": "bool"}, + "match_map": {"type": "str"}, + "attribute_map": {"type": "str"}, + "as_set": {"type": "bool"}, + "summary_only": {"type": "bool"}, + "address": {"type": "str"}, + }, + }, + "neighbor": { + "elements": "dict", + "type": "list", + "aliases": ["neighbors"], + "options": { + "bfd": {"type": "str", "choices": ["c_bit", "enable"]}, + "weight": {"type": "int"}, + "default_originate": { + "type": "dict", + "options": { + "route_map": {"type": "str"}, + "always": {"type": "bool"}, + }, + }, + "next_hop_v6_address": {"type": "str"}, + "route_reflector_client": {"type": "bool"}, + "ttl": {"type": "int"}, + "remove_private_as": { + "type": "dict", + "options": { + "all": {"type": "bool"}, + "set": {"type": "bool"}, + "replace_as": {"type": "bool"}, + }, + }, + "local_v6_addr": {"type": "str"}, + "transport": { + "type": "dict", + "options": { + "connection_mode": {"type": "str"}, + "remote_port": {"type": "int"}, + }, + }, + "next_hop_unchanged": {"type": "bool"}, + "monitoring": {"type": "bool"}, + "ebgp_multihop": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "ttl": {"type": "int"}, + }, + }, + "shutdown": {"type": "bool"}, + "fall_over": {"type": "bool"}, + "idle_restart_timer": {"type": "int"}, + "allowas_in": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + "additional_paths": { + "type": "str", + "choices": ["send", "receive"], + }, + "peer_group": {"type": "str"}, + "out_delay": {"type": "int"}, + "import_localpref": {"type": "int"}, + "prefix_list": { + "type": "dict", + "options": { + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + "name": {"type": "str"}, + }, + }, + "dont_capability_negotiate": {"type": "bool"}, + "update_source": {"type": "str"}, + "export_localpref": {"type": "int"}, + "local_as": { + "type": "dict", + "options": { + "as_number": {"type": "str"}, + "fallback": {"type": "bool"}, + }, + }, + "maximum_received_routes": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "warning_limit": { + "type": "dict", + "options": { + "limit_count": {"type": "int"}, + "limit_percent": {"type": "int"}, + }, + }, + "warning_only": {"type": "bool"}, + }, + }, + "encryption_password": { + "type": "dict", + "no_log": True, + "options": { + "password": {"type": "str", "no_log": True}, + "type": {"type": "int", "choices": [0, 7]}, + }, + }, + "link_bandwidth": { + "type": "dict", + "options": { + "default": {"type": "str"}, + "auto": {"type": "bool"}, + "set": {"type": "bool"}, + "update_delay": {"type": "int"}, + }, + }, + "graceful_restart_helper": {"type": "bool"}, + "neighbor_address": { + "type": "str", + "aliases": ["peer"], + }, + "next_hop_self": {"type": "bool"}, + "route_to_peer": {"type": "bool"}, + "soft_recognition": { + "type": "str", + "choices": ["all", "None"], + }, + "graceful_restart": {"type": "bool"}, + "enforce_first_as": {"type": "bool"}, + "send_community": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "community_attribute": {"type": "str"}, + "sub_attribute": { + "type": "str", + "choices": [ + "extended", + "link-bandwidth", + "standard", + ], + }, + "speed": {"type": "str"}, + "divide": { + "type": "str", + "choices": ["equal", "ratio"], + }, + "link_bandwidth_attribute": { + "type": "str", + "choices": ["aggregate", "divide"], + }, + }, + }, + "description": {"type": "str"}, + "maximum_accepted_routes": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "warning_limit": {"type": "int"}, + }, + }, + "auto_local_addr": {"type": "bool"}, + "metric_out": {"type": "int"}, + "timers": { + "type": "dict", + "options": { + "holdtime": {"type": "int"}, + "keepalive": {"type": "int"}, + }, + }, + "route_map": { + "type": "dict", + "options": { + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + "name": {"type": "str"}, + }, + }, + "remote_as": {"type": "str"}, + }, + }, + "graceful_restart": { + "type": "dict", + "options": { + "stalepath_time": {"type": "int"}, + "restart_time": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + "timers": { + "type": "dict", + "options": { + "holdtime": {"type": "int"}, + "keepalive": {"type": "int"}, + }, + }, + "distance": { + "type": "dict", + "options": { + "internal": {"type": "int"}, + "local": {"type": "int"}, + "external": {"type": "int"}, + }, + }, + "route_target": { + "type": "dict", + "options": { + "action": { + "type": "str", + "choices": ["both", "import", "export"], + }, + "target": {"type": "str"}, + }, + }, + "vrfs": { + "elements": "dict", + "type": "list", + "options": { + "access_group": { + "elements": "dict", + "type": "list", + "options": { + "direction": {"type": "str"}, + "afi": { + "type": "str", + "choices": ["ipv4", "ipv6"], + }, + "acl_name": {"type": "str"}, + }, + }, + "router_id": {"type": "str"}, + "vrf": {"type": "str"}, + "route_target": { + "type": "dict", + "options": { + "action": { + "type": "str", + "choices": ["both", "import", "export"], + }, + "type": { + "type": "str", + "choices": [ + "evpn", + "vpn-ipv4", + "vpn-ipv6", + ], + }, + "route_map": {"type": "str"}, + "target": {"type": "str"}, + "imported_route": {"type": "bool"}, + }, + }, + "redistribute": { + "elements": "dict", + "type": "list", + "options": { + "ospf_route": { + "type": "str", + "choices": [ + "internal", + "external", + "nssa_external_1", + "nssa_external_2", + ], + }, + "route_map": {"type": "str"}, + "protocol": { + "type": "str", + "choices": [ + "isis", + "ospfv3", + "ospf", + "attached-host", + "connected", + "rip", + "static", + ], + }, + "isis_level": { + "type": "str", + "choices": [ + "level-1", + "level-2", + "level-1-2", + ], + }, + }, + }, + "distance": { + "type": "dict", + "options": { + "internal": {"type": "int"}, + "local": {"type": "int"}, + "external": {"type": "int"}, + }, + }, + "default_metric": {"type": "int"}, + "bgp_params": { + "type": "dict", + "options": { + "control_plane_filter": {"type": "bool"}, + "convergence": { + "type": "dict", + "options": { + "slow_peer": {"type": "bool"}, + "time": {"type": "int"}, + }, + }, + "host_routes": {"type": "bool"}, + "transport": {"type": "int"}, + "next_hop_unchanged": {"type": "bool"}, + "missing_policy": { + "type": "dict", + "options": { + "action": { + "type": "str", + "choices": [ + "deny", + "permit", + "deny-in-out", + ], + }, + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + }, + }, + "monitoring": {"type": "bool"}, + "allowas_in": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + "additional_paths": { + "type": "str", + "choices": ["install", "send", "receive"], + }, + "advertise_inactive": {"type": "bool"}, + "listen": { + "type": "dict", + "options": { + "range": { + "type": "dict", + "options": { + "peer_group": { + "type": "dict", + "options": { + "peer_filter": { + "type": "str", + }, + "remote_as": { + "type": "str", + }, + "name": { + "type": "str", + }, + }, + }, + "address": {"type": "str"}, + }, + }, + "limit": {"type": "int"}, + }, + }, + "route_reflector": { + "type": "dict", + "options": { + "preserve": {"type": "bool"}, + "set": {"type": "bool"}, + }, + }, + "always_compare_med": {"type": "bool"}, + "client_to_client": {"type": "bool"}, + "bestpath": { + "type": "dict", + "options": { + "ecmp_fast": {"type": "bool"}, + "tie_break": { + "type": "str", + "choices": [ + "cluster_list_length", + "router_id", + ], + }, + "skip": {"type": "bool"}, + "as_path": { + "type": "str", + "choices": [ + "ignore", + "multipath_relax", + ], + }, + "med": { + "type": "dict", + "options": { + "confed": {"type": "bool"}, + "missing_as_worst": { + "type": "bool", + }, + }, + }, + }, + }, + "labeled_unicast": { + "type": "str", + "choices": ["ip", "tunnel"], + }, + "log_neighbor_changes": {"type": "bool"}, + "asn": { + "type": "str", + "choices": ["asdot", "asplain"], + }, + "default": { + "type": "str", + "choices": [ + "ipv4_unicast", + "ipv6_unicast", + ], + }, + "route": {"type": "str"}, + "enforce_first_as": {"type": "bool"}, + "auto_local_addr": {"type": "bool"}, + "redistribute_internal": {"type": "bool"}, + "cluster_id": {"type": "str"}, + "confederation": { + "type": "dict", + "options": { + "peers": {"type": "str"}, + "identifier": {"type": "str"}, + }, + }, + }, + }, + "update": { + "type": "dict", + "options": { + "wait_for": { + "type": "str", + "choices": [ + "wait_for_convergence", + "wait_install", + ], + }, + "batch_size": {"type": "int"}, + }, + }, + "aggregate_address": { + "elements": "dict", + "type": "list", + "options": { + "advertise_only": {"type": "bool"}, + "match_map": {"type": "str"}, + "attribute_map": {"type": "str"}, + "as_set": {"type": "bool"}, + "summary_only": {"type": "bool"}, + "address": {"type": "str"}, + }, + }, + "neighbor": { + "elements": "dict", + "aliases": ["neighbors"], + "type": "list", + "options": { + "bfd": { + "type": "str", + "choices": ["c_bit", "enable"], + }, + "weight": {"type": "int"}, + "default_originate": { + "type": "dict", + "options": { + "route_map": {"type": "str"}, + "always": {"type": "bool"}, + }, + }, + "next_hop_v6_address": {"type": "str"}, + "route_reflector_client": {"type": "bool"}, + "ttl": {"type": "int"}, + "remove_private_as": { + "type": "dict", + "options": { + "all": {"type": "bool"}, + "set": {"type": "bool"}, + "replace_as": {"type": "bool"}, + }, + }, + "local_v6_addr": {"type": "str"}, + "transport": { + "type": "dict", + "options": { + "connection_mode": {"type": "str"}, + "remote_port": {"type": "int"}, + }, + }, + "next_hop_unchanged": {"type": "bool"}, + "monitoring": {"type": "bool"}, + "ebgp_multihop": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "ttl": {"type": "int"}, + }, + }, + "shutdown": {"type": "bool"}, + "fall_over": {"type": "bool"}, + "idle_restart_timer": {"type": "int"}, + "allowas_in": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + "additional_paths": { + "type": "str", + "choices": ["send", "receive"], + }, + "peer_group": {"type": "str"}, + "out_delay": {"type": "int"}, + "import_localpref": {"type": "int"}, + "prefix_list": { + "type": "dict", + "options": { + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + "name": {"type": "str"}, + }, + }, + "dont_capability_negotiate": {"type": "bool"}, + "update_source": {"type": "str"}, + "export_localpref": {"type": "int"}, + "local_as": { + "type": "dict", + "options": { + "as_number": {"type": "str"}, + "fallback": {"type": "bool"}, + }, + }, + "maximum_received_routes": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "warning_limit": { + "type": "dict", + "options": { + "limit_count": {"type": "int"}, + "limit_percent": { + "type": "int", + }, + }, + }, + "warning_only": {"type": "bool"}, + }, + }, + "encryption_password": { + "type": "dict", + "no_log": True, + "options": { + "password": { + "type": "str", + "no_log": True, + }, + "type": { + "type": "int", + "choices": [0, 7], + }, + }, + }, + "link_bandwidth": { + "type": "dict", + "options": { + "default": {"type": "str"}, + "auto": {"type": "bool"}, + "set": {"type": "bool"}, + "update_delay": {"type": "int"}, + }, + }, + "graceful_restart_helper": {"type": "bool"}, + "neighbor_address": { + "type": "str", + "aliases": ["peer"], + }, + "next_hop_self": {"type": "bool"}, + "route_to_peer": {"type": "bool"}, + "soft_recognition": { + "type": "str", + "choices": ["all", "None"], + }, + "graceful_restart": {"type": "bool"}, + "enforce_first_as": {"type": "bool"}, + "send_community": { + "type": "dict", + "options": { + "community_attribute": {"type": "str"}, + "sub_attribute": { + "type": "str", + "choices": [ + "extended", + "link-bandwidth", + "standard", + ], + }, + "speed": {"type": "str"}, + "divide": { + "type": "str", + "choices": ["equal", "ratio"], + }, + "link_bandwidth_attribute": { + "type": "str", + "choices": ["aggregate", "divide"], + }, + }, + }, + "description": {"type": "str"}, + "maximum_accepted_routes": { + "type": "dict", + "options": { + "count": {"type": "int"}, + "warning_limit": {"type": "int"}, + }, + }, + "auto_local_addr": {"type": "bool"}, + "metric_out": {"type": "int"}, + "timers": { + "type": "dict", + "options": { + "holdtime": {"type": "int"}, + "keepalive": {"type": "int"}, + }, + }, + "route_map": { + "type": "dict", + "options": { + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + "name": {"type": "str"}, + }, + }, + "remote_as": {"type": "str"}, + }, + }, + "graceful_restart": { + "type": "dict", + "options": { + "stalepath_time": {"type": "int"}, + "restart_time": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + "timers": { + "type": "dict", + "options": { + "holdtime": {"type": "int"}, + "keepalive": {"type": "int"}, + }, + }, + "shutdown": {"type": "bool"}, + "graceful_restart_helper": {"type": "bool"}, + "ucmp": { + "type": "dict", + "options": { + "link_bandwidth": { + "type": "dict", + "options": { + "update_delay": {"type": "int"}, + "mode": { + "type": "str", + "choices": [ + "encoding_weighted", + "recursive", + "update_delay", + ], + }, + }, + }, + "fec": { + "type": "dict", + "options": { + "clear": {"type": "int"}, + "trigger": {"type": "int"}, + }, + }, + "mode": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "nexthops": {"type": "int"}, + }, + }, + }, + }, + "maximum_paths": { + "type": "dict", + "options": { + "max_equal_cost_paths": {"type": "int"}, + "max_installed_ecmp_paths": {"type": "int"}, + }, + }, + "network": { + "type": "list", + "aliases": ["networks"], + "elements": "dict", + "options": { + "route_map": {"type": "str"}, + "address": {"type": "str"}, + }, + }, + }, + }, + "access_group": { + "elements": "dict", + "type": "list", + "options": { + "direction": {"type": "str"}, + "afi": {"type": "str", "choices": ["ipv4", "ipv6"]}, + "acl_name": {"type": "str"}, + }, + }, + "graceful_restart_helper": {"type": "bool"}, + "ucmp": { + "type": "dict", + "options": { + "link_bandwidth": { + "type": "dict", + "options": { + "update_delay": {"type": "int"}, + "mode": { + "type": "str", + "choices": [ + "encoding_weighted", + "recursive", + ], + }, + }, + }, + "fec": { + "type": "dict", + "options": { + "clear": {"type": "int"}, + "trigger": {"type": "int"}, + }, + }, + "mode": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "nexthops": {"type": "int"}, + }, + }, + }, + }, + "shutdown": {"type": "bool"}, + "maximum_paths": { + "type": "dict", + "options": { + "max_equal_cost_paths": {"type": "int"}, + "max_installed_ecmp_paths": {"type": "int"}, + }, + }, + "network": { + "type": "list", + "aliases": ["networks"], + "elements": "dict", + "options": { + "route_map": {"type": "str"}, + "address": {"type": "str"}, + }, + }, + }, + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/facts/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/facts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/facts/facts.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/facts/facts.py new file mode 100644 index 000000000..beef509a8 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/facts/facts.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The arg spec for the eos facts module. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class FactsArgs(object): + """The arg spec for the eos facts module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "gather_subset": dict(default=["min"], type="list", elements="str"), + "gather_network_resources": dict(type="list", elements="str"), + "available_network_resources": {"type": "bool", "default": False}, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/hostname/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/hostname/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/hostname/hostname.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/hostname/hostname.py new file mode 100644 index 000000000..8e866d4dc --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/hostname/hostname.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the +# cli_rm_builder. +# +# Manually editing this file is not advised. +# +# To update the argspec make the desired changes +# in the module docstring and re-run +# cli_rm_builder. +# +############################################# + +""" +The arg spec for the eos_hostname module +""" + + +class HostnameArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_hostname module""" + + argument_spec = { + "config": {"type": "dict", "options": {"hostname": {"type": "str"}}}, + "running_config": {"type": "str"}, + "state": { + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/interfaces/interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/interfaces/interfaces.py new file mode 100644 index 000000000..bd861c6b5 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/interfaces/interfaces.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################## +# WARNING # +############################################## +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################## + +""" +The arg spec for the eos_interfaces module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class InterfacesArgs(object): + """The arg spec for the eos_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "name": {"required": True, "type": "str"}, + "description": {"required": False, "type": "str"}, + "enabled": { + "default": True, + "required": False, + "type": "bool", + }, + "mtu": {"required": False, "type": "int"}, + "speed": {"required": False, "type": "str"}, + "duplex": {"required": False, "type": "str"}, + "mode": {"choices": ["layer2", "layer3"], "type": "str"}, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "required": False, + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l2_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l2_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l2_interfaces/l2_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l2_interfaces/l2_interfaces.py new file mode 100644 index 000000000..bdf7e7451 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l2_interfaces/l2_interfaces.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################## +# WARNING # +############################################## +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################## + +""" +The arg spec for the eos_l2_interfaces module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class L2_interfacesArgs(object): + """The arg spec for the eos_l2_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "access": { + "options": {"vlan": {"type": "int"}}, + "type": "dict", + }, + "mode": {"type": "str", "choices": ["access", "trunk"]}, + "name": {"required": True, "type": "str"}, + "trunk": { + "options": { + "native_vlan": {"type": "int"}, + "trunk_allowed_vlans": { + "type": "list", + "elements": "str", + }, + }, + "type": "dict", + }, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "required": False, + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l3_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l3_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l3_interfaces/l3_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l3_interfaces/l3_interfaces.py new file mode 100644 index 000000000..a4ac42f63 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/l3_interfaces/l3_interfaces.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_l3_interfaces module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class L3_interfacesArgs(object): + """The arg spec for the eos_l3_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "name": {"required": True, "type": "str"}, + "ipv4": { + "elements": "dict", + "options": { + "address": {"type": "str"}, + "secondary": {"type": "bool"}, + "virtual": {"type": "bool"}, + }, + "type": "list", + }, + "ipv6": { + "elements": "dict", + "options": {"address": {"type": "str"}}, + "type": "list", + }, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp/lacp.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp/lacp.py new file mode 100644 index 000000000..bbb9df8db --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp/lacp.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_lacp module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class LacpArgs(object): + """The arg spec for the eos_lacp module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "options": { + "system": { + "options": {"priority": {"type": "int"}}, + "type": "dict", + }, + }, + "type": "dict", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "merged", + "replaced", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp_interfaces/lacp_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp_interfaces/lacp_interfaces.py new file mode 100644 index 000000000..bea5a062b --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lacp_interfaces/lacp_interfaces.py @@ -0,0 +1,69 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_lacp_interfaces module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class Lacp_interfacesArgs(object): + """The arg spec for the eos_lacp_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "name": {"type": "str"}, + "port_priority": {"type": "int"}, + "timer": { + "choices": ["fast", "normal"], + "type": "str", + "aliases": ["rate"], + }, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lag_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lag_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lag_interfaces/lag_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lag_interfaces/lag_interfaces.py new file mode 100644 index 000000000..0f2aa73dd --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lag_interfaces/lag_interfaces.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_lag_interfaces module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class Lag_interfacesArgs(object): + """The arg spec for the eos_lag_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "name": {"required": True, "type": "str"}, + "members": { + "elements": "dict", + "options": { + "member": {"type": "str"}, + "mode": { + "choices": ["active", "on", "passive"], + "type": "str", + }, + }, + "type": "list", + }, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_global/lldp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_global/lldp_global.py new file mode 100644 index 000000000..cc0ea3190 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_global/lldp_global.py @@ -0,0 +1,75 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_lldp_global module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class Lldp_globalArgs(object): + """The arg spec for the eos_lldp_global module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "options": { + "holdtime": {"type": "int"}, + "reinit": {"type": "int"}, + "timer": {"type": "int"}, + "tlv_select": { + "options": { + "link_aggregation": {"type": "bool"}, + "management_address": {"type": "bool"}, + "max_frame_size": {"type": "bool"}, + "port_description": {"type": "bool"}, + "system_capabilities": {"type": "bool"}, + "system_description": {"type": "bool"}, + "system_name": {"type": "bool"}, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "merged", + "replaced", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_interfaces/lldp_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_interfaces/lldp_interfaces.py new file mode 100644 index 000000000..fa0d409f0 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/lldp_interfaces/lldp_interfaces.py @@ -0,0 +1,65 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_lldp_interfaces module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class Lldp_interfacesArgs(object): + """The arg spec for the eos_lldp_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "name": {"type": "str"}, + "receive": {"type": "bool"}, + "transmit": {"type": "bool"}, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/logging_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/logging_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/logging_global/logging_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/logging_global/logging_global.py new file mode 100644 index 000000000..7899a3933 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/logging_global/logging_global.py @@ -0,0 +1,253 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the +# cli_rm_builder. +# +# Manually editing this file is not advised. +# +# To update the argspec make the desired changes +# in the module docstring and re-run +# cli_rm_builder. +# +############################################# + +""" +The arg spec for the eos_logging_global module +""" + + +class Logging_globalArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_logging_global module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "type": "dict", + "options": { + "buffered": { + "type": "dict", + "options": { + "severity": { + "type": "str", + "choices": [ + "alerts", + "critical", + "debugging", + "emergencies", + "errors", + "informational", + "notifications", + "warnings", + ], + }, + "buffer_size": {"type": "int"}, + }, + }, + "console": { + "type": "dict", + "options": { + "severity": { + "type": "str", + "choices": [ + "alerts", + "critical", + "debugging", + "emergencies", + "errors", + "informational", + "notifications", + "warnings", + ], + }, + }, + }, + "event": { + "type": "str", + "choices": [ + "link-status", + "port-channel", + "spanning-tree", + ], + }, + "facility": { + "type": "str", + "choices": [ + "auth", + "cron", + "daemon", + "kern", + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7", + "lpr", + "mail", + "news", + "sys10", + "sys11", + "sys12", + "sys13", + "sys14", + "sys9", + "syslog", + "user", + "uucp", + ], + }, + "format": { + "type": "dict", + "options": { + "hostname": {"type": "str"}, + "timestamp": { + "type": "dict", + "options": { + "high_resolution": {"type": "bool"}, + "traditional": { + "type": "dict", + "options": { + "state": { + "type": "str", + "choices": ["enabled", "disabled"], + }, + "timezone": {"type": "bool"}, + "year": {"type": "bool"}, + }, + }, + }, + }, + "sequence_numbers": {"type": "bool"}, + }, + }, + "hosts": { + "type": "list", + "elements": "dict", + "options": { + "name": {"type": "str"}, + "add": {"type": "bool"}, + "remove": {"type": "bool"}, + "protocol": {"type": "str", "choices": ["tcp", "udp"]}, + "port": {"type": "int"}, + }, + }, + "level": { + "type": "dict", + "options": { + "facility": {"type": "str"}, + "severity": { + "type": "str", + "choices": [ + "alerts", + "critical", + "debugging", + "emergencies", + "errors", + "informational", + "notifications", + "warnings", + ], + }, + }, + }, + "monitor": {"type": "str"}, + "turn_on": {"type": "bool"}, + "persistent": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "size": {"type": "int"}, + }, + }, + "policy": { + "type": "dict", + "options": { + "invert_result": {"type": "bool"}, + "match_list": {"type": "str"}, + }, + }, + "qos": {"type": "int"}, + "relogging_interval": {"type": "int"}, + "repeat_messages": {"type": "bool"}, + "source_interface": {"type": "str"}, + "synchronous": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "level": {"type": "str"}, + }, + }, + "trap": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "severity": { + "type": "str", + "choices": [ + "alerts", + "critical", + "debugging", + "emergencies", + "errors", + "informational", + "notifications", + "warnings", + ], + }, + }, + }, + "vrfs": { + "type": "list", + "elements": "dict", + "options": { + "name": {"type": "str"}, + "hosts": { + "type": "list", + "elements": "dict", + "options": { + "name": {"type": "str"}, + "add": {"type": "bool"}, + "remove": {"type": "bool"}, + "protocol": { + "type": "str", + "choices": ["tcp", "udp"], + }, + "port": {"type": "int"}, + }, + }, + "source_interface": {"type": "str"}, + }, + }, + }, + }, + "running_config": {"type": "str"}, + "state": { + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ntp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ntp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ntp_global/ntp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ntp_global/ntp_global.py new file mode 100644 index 000000000..ad3a231dd --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ntp_global/ntp_global.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the +# cli_rm_builder. +# +# Manually editing this file is not advised. +# +# To update the argspec make the desired changes +# in the module docstring and re-run +# cli_rm_builder. +# +############################################# + +""" +The arg spec for the eos_ntp_global module +""" + + +class Ntp_globalArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_ntp_global module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "type": "dict", + "options": { + "authenticate": { + "type": "dict", + "options": { + "enable": {"type": "bool"}, + "servers": {"type": "bool"}, + }, + }, + "authentication_keys": { + "type": "list", + "elements": "dict", + "no_log": False, + "options": { + "id": {"type": "int"}, + "algorithm": { + "type": "str", + "choices": ["md5", "sha1"], + }, + "encryption": {"type": "int", "choices": [0, 7]}, + "key": {"type": "str", "no_log": True}, + }, + }, + "local_interface": {"type": "str"}, + "qos_dscp": {"type": "int"}, + "serve": { + "type": "dict", + "options": { + "all": {"type": "bool"}, + "access_lists": { + "type": "list", + "elements": "dict", + "options": { + "afi": {"type": "str"}, + "acls": { + "type": "list", + "elements": "dict", + "options": { + "acl_name": {"type": "str"}, + "direction": { + "type": "str", + "choices": ["in", "out"], + }, + "vrf": {"type": "str"}, + }, + }, + }, + }, + }, + }, + "servers": { + "type": "list", + "elements": "dict", + "options": { + "vrf": {"type": "str"}, + "server": {"type": "str", "required": True}, + "burst": {"type": "bool"}, + "iburst": {"type": "bool"}, + "key_id": {"type": "int"}, + "local_interface": {"type": "str"}, + "source": {"type": "str"}, + "maxpoll": {"type": "int"}, + "minpoll": {"type": "int"}, + "prefer": {"type": "bool"}, + "version": {"type": "int"}, + }, + }, + "trusted_key": {"type": "str", "no_log": False}, + }, + }, + "running_config": {"type": "str"}, + "state": { + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospf_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospf_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospf_interfaces/ospf_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospf_interfaces/ospf_interfaces.py new file mode 100644 index 000000000..3e8dcbc9f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospf_interfaces/ospf_interfaces.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_ospf_interfaces module +""" + + +class Ospf_interfacesArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_ospf_interfaces module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "state": { + "default": "merged", + "type": "str", + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "parsed", + "rendered", + ], + }, + "running_config": {"type": "str"}, + "config": { + "elements": "dict", + "type": "list", + "options": { + "name": {"type": "str"}, + "address_family": { + "elements": "dict", + "type": "list", + "options": { + "ip_params": { + "elements": "dict", + "type": "list", + "options": { + "retransmit_interval": {"type": "int"}, + "cost": {"type": "int"}, + "afi": { + "required": True, + "type": "str", + "choices": ["ipv4", "ipv6"], + }, + "area": { + "type": "dict", + "options": { + "area_id": { + "required": True, + "type": "str", + }, + }, + }, + "bfd": {"type": "bool"}, + "mtu_ignore": {"type": "bool"}, + "priority": {"type": "int"}, + "dead_interval": {"type": "int"}, + "hello_interval": {"type": "int"}, + "passive_interface": {"type": "bool"}, + "transmit_delay": {"type": "int"}, + "network": {"type": "str"}, + }, + }, + "encryption_v3": { + "type": "dict", + "options": { + "key": {"type": "str", "no_log": True}, + "algorithm": { + "type": "str", + "choices": ["md5", "sha1"], + }, + "encryption": { + "type": "str", + "choices": [ + "3des-cbc", + "aes-128-cbc", + "aes-192-cbc", + "aes-256-cbc", + "null", + ], + }, + "keytype": {"type": "str", "no_log": False}, + "spi": {"type": "int"}, + "passphrase": {"type": "str", "no_log": True}, + }, + }, + "cost": {"type": "int"}, + "afi": { + "required": True, + "type": "str", + "choices": ["ipv4", "ipv6"], + }, + "authentication_v2": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "message_digest": {"type": "bool"}, + }, + }, + "bfd": {"type": "bool"}, + "authentication_v3": { + "type": "dict", + "options": { + "key": {"type": "str", "no_log": True}, + "spi": {"type": "int"}, + "keytype": {"type": "str", "no_log": False}, + "passphrase": {"type": "str", "no_log": True}, + "algorithm": { + "type": "str", + "choices": ["md5", "sha1"], + }, + }, + }, + "retransmit_interval": {"type": "int"}, + "message_digest_key": { + "no_log": False, + "type": "dict", + "options": { + "key_id": {"type": "int"}, + "key": {"type": "str", "no_log": True}, + "encryption": {"type": "str"}, + }, + }, + "mtu_ignore": {"type": "bool"}, + "priority": {"type": "int"}, + "area": { + "type": "dict", + "options": { + "area_id": {"required": True, "type": "str"}, + }, + }, + "dead_interval": {"type": "int"}, + "shutdown": {"type": "bool"}, + "passive_interface": {"type": "bool"}, + "authentication_key": { + "type": "dict", + "no_log": False, + "options": { + "encryption": {"type": "str"}, + "key": {"type": "str", "no_log": True}, + }, + }, + "hello_interval": {"type": "int"}, + "transmit_delay": {"type": "int"}, + "network": {"type": "str"}, + }, + }, + }, + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv2/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv2/ospfv2.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv2/ospfv2.py new file mode 100644 index 000000000..42388d8d5 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv2/ospfv2.py @@ -0,0 +1,340 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# +""" +The arg spec for the eos_ospfv2 module +""" + + +class Ospfv2Args(object): # pylint: disable=R0903 + """The arg spec for the eos_ospfv2 module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "options": { + "processes": { + "elements": "dict", + "options": { + "process_id": {"type": "int"}, + "vrf": {"type": "str"}, + "traffic_engineering": {"type": "bool"}, + "adjacency": { + "options": { + "exchange_start": { + "options": {"threshold": {"type": "int"}}, + "type": "dict", + }, + }, + "type": "dict", + }, + "areas": { + "elements": "dict", + "options": { + "default_cost": {"type": "int"}, + "filter": { + "options": { + "address": {"type": "str"}, + "prefix_list": {"type": "str"}, + "subnet_address": {"type": "str"}, + "subnet_mask": {"type": "str"}, + }, + "type": "dict", + }, + "not_so_stubby": { + "options": { + "default_information_originate": { + "options": { + "metric": {"type": "int"}, + "metric_type": {"type": "int"}, + "nssa_only": {"type": "bool"}, + }, + "type": "dict", + }, + "no_summary": {"type": "bool"}, + "nssa_only": {"type": "bool"}, + "lsa": {"type": "bool"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + "nssa": { + "options": { + "default_information_originate": { + "options": { + "metric": {"type": "int"}, + "metric_type": {"type": "int"}, + "nssa_only": {"type": "bool"}, + }, + "type": "dict", + }, + "no_summary": {"type": "bool"}, + "nssa_only": {"type": "bool"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + "area_id": {"type": "str"}, + "range": { + "options": { + "address": {"type": "str"}, + "advertise": {"type": "bool"}, + "cost": {"type": "int"}, + "subnet_address": {"type": "str"}, + "subnet_mask": {"type": "str"}, + }, + "type": "dict", + }, + "stub": { + "options": { + "no_summary": {"type": "bool"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + }, + "type": "list", + }, + "auto_cost": { + "options": { + "reference_bandwidth": {"type": "int"}, + }, + "type": "dict", + }, + "bfd": { + "options": {"all_interfaces": {"type": "bool"}}, + "type": "dict", + }, + "default_information": { + "options": { + "always": {"type": "bool"}, + "metric": {"type": "int"}, + "metric_type": {"type": "int"}, + "originate": {"type": "bool"}, + "route_map": {"type": "str"}, + }, + "type": "dict", + }, + "default_metric": {"type": "int"}, + "distance": { + "options": { + "external": {"type": "int"}, + "inter_area": {"type": "int"}, + "intra_area": {"type": "int"}, + }, + "type": "dict", + }, + "distribute_list": { + "options": { + "prefix_list": {"type": "str"}, + "route_map": {"type": "str"}, + }, + "type": "dict", + }, + "dn_bit_ignore": {"type": "bool"}, + "fips_restrictions": {"type": "str"}, + "graceful_restart": { + "options": { + "grace_period": {"type": "int"}, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + "graceful_restart_helper": {"type": "bool"}, + "log_adjacency_changes": { + "options": {"detail": {"type": "bool"}}, + "type": "dict", + }, + "max_lsa": { + "options": { + "count": {"type": "int"}, + "ignore_count": {"type": "int"}, + "ignore_time": {"type": "int"}, + "reset_time": {"type": "int"}, + "threshold": {"type": "int"}, + "warning": {"type": "bool"}, + }, + "type": "dict", + }, + "max_metric": { + "options": { + "router_lsa": { + "options": { + "set": {"type": "bool"}, + "include_stub": {"type": "bool"}, + "on_startup": { + "options": { + "wait_period": {"type": "int"}, + }, + "type": "dict", + }, + "summary_lsa": { + "options": { + "max_metric_value": { + "type": "int", + }, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + "external_lsa": { + "options": { + "max_metric_value": { + "type": "int", + }, + "set": {"type": "bool"}, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "maximum_paths": {"type": "int"}, + "mpls_ldp": {"type": "bool"}, + "networks": { + "elements": "dict", + "options": { + "area": {"type": "str"}, + "mask": {"type": "str"}, + "network_address": {"type": "str"}, + "prefix": {"type": "str"}, + }, + "type": "list", + }, + "passive_interface": { + "type": "dict", + "options": { + "interface_list": {"type": "str"}, + "default": {"type": "bool"}, + }, + }, + "point_to_point": {"type": "bool"}, + "redistribute": { + "elements": "dict", + "options": { + "isis_level": {"type": "str"}, + "route_map": {"type": "str"}, + "routes": {"type": "str"}, + }, + "type": "list", + }, + "retransmission_threshold": {"type": "int"}, + "rfc1583compatibility": {"type": "bool"}, + "router_id": {"type": "str"}, + "shutdown": {"type": "bool"}, + "summary_address": { + "options": { + "address": {"type": "str"}, + "attribute_map": {"type": "str"}, + "mask": {"type": "str"}, + "not_advertise": {"type": "bool"}, + "prefix": {"type": "str"}, + "tag": {"type": "int"}, + }, + "type": "dict", + }, + "timers": { + "elements": "dict", + "options": { + "lsa": { + "options": { + "rx": { + "options": { + "min_interval": { + "type": "int", + }, + }, + "type": "dict", + }, + "tx": { + "options": { + "delay": { + "options": { + "initial": { + "type": "int", + }, + "max": {"type": "int"}, + "min": {"type": "int"}, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + }, + "type": "dict", + }, + "out_delay": {"type": "int"}, + "pacing": {"type": "int"}, + "spf": { + "options": { + "initial": {"type": "int"}, + "max": {"type": "int"}, + "min": {"type": "int"}, + "seconds": {"type": "int"}, + }, + "type": "dict", + }, + "throttle": { + "options": { + "attr": {"type": "str"}, + "initial": {"type": "int"}, + "max": {"type": "int"}, + "min": {"type": "int"}, + }, + "type": "dict", + }, + }, + "type": "list", + }, + }, + "type": "list", + }, + }, + "type": "dict", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv3/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv3/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv3/ospfv3.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv3/ospfv3.py new file mode 100644 index 000000000..ece4db0cd --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/ospfv3/ospfv3.py @@ -0,0 +1,532 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_ospfv3 module +""" + + +class Ospfv3Args(object): # pylint: disable=R0903 + """The arg spec for the eos_ospfv3 module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + }, + "config": { + "type": "dict", + "options": { + "processes": { + "elements": "dict", + "type": "list", + "options": { + "router_id": {"type": "str"}, + "shutdown": {"type": "bool"}, + "fips_restrictions": {"type": "bool"}, + "graceful_restart_helper": {"type": "bool"}, + "adjacency": { + "type": "dict", + "options": { + "exchange_start": { + "type": "dict", + "options": {"threshold": {"type": "int"}}, + }, + }, + }, + "max_metric": { + "type": "dict", + "options": { + "router_lsa": { + "type": "dict", + "options": { + "external_lsa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "max_metric_value": { + "type": "int", + }, + }, + }, + "summary_lsa": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "max_metric_value": { + "type": "int", + }, + }, + }, + "set": {"type": "bool"}, + "on_startup": { + "type": "dict", + "options": { + "wait_for_bgp": { + "type": "bool", + }, + "wait_period": {"type": "int"}, + }, + }, + "include_stub": {"type": "bool"}, + }, + }, + }, + }, + "log_adjacency_changes": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "detail": {"type": "bool"}, + }, + }, + "graceful_restart": { + "type": "dict", + "options": { + "grace_period": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + "timers": { + "type": "dict", + "options": { + "throttle": { + "type": "dict", + "options": { + "max": {"type": "int"}, + "initial": {"type": "int"}, + "min": {"type": "int"}, + "spf": {"type": "bool"}, + "lsa": {"type": "bool"}, + }, + }, + "spf": { + "type": "dict", + "options": { + "max": {"type": "int"}, + "initial": {"type": "int"}, + "min": {"type": "int"}, + }, + }, + "lsa": { + "type": "raw", + "options": { + "max": {"type": "int"}, + "initial": {"type": "int"}, + "min": {"type": "int"}, + "direction": { + "type": "str", + "choices": ["rx", "tx"], + }, + }, + }, + "out_delay": {"type": "int"}, + "pacing": {"type": "int"}, + }, + }, + "vrf": {"type": "str"}, + "auto_cost": { + "type": "dict", + "options": { + "reference_bandwidth": {"type": "int"}, + }, + }, + "passive_interface": {"type": "bool"}, + "bfd": { + "type": "dict", + "options": {"all_interfaces": {"type": "bool"}}, + }, + "areas": { + "elements": "dict", + "type": "list", + "options": { + "area_id": {"type": "str"}, + "encryption": { + "type": "dict", + "options": { + "hidden_key": {"type": "bool"}, + "key": {"type": "str", "no_log": True}, + "algorithm": { + "type": "str", + "choices": ["sha1", "md5"], + }, + "encrypt_key": {"type": "bool"}, + "encryption": { + "type": "str", + "choices": [ + "3des-cbc", + "aes-128-cbc", + "aes-192-cbc", + "aes-256-cbc", + "null", + ], + }, + "spi": {"type": "int"}, + "passphrase": { + "type": "str", + "no_log": True, + }, + }, + }, + "nssa": { + "type": "dict", + "options": { + "translate": {"type": "bool"}, + "default_information_originate": { + "type": "dict", + "options": { + "metric_type": {"type": "int"}, + "metric": {"type": "int"}, + "nssa_only": {"type": "bool"}, + "set": {"type": "bool"}, + }, + }, + "nssa_only": {"type": "bool"}, + "set": {"type": "bool"}, + "no_summary": {"type": "bool"}, + }, + }, + "stub": { + "type": "dict", + "options": { + "summary_lsa": {"type": "bool"}, + "set": {"type": "bool"}, + }, + }, + "default_cost": {"type": "int"}, + "authentication": { + "type": "dict", + "options": { + "hidden_key": {"type": "bool"}, + "key": {"type": "str", "no_log": True}, + "algorithm": { + "type": "str", + "choices": ["md5", "sha1"], + }, + "encrypt_key": {"type": "bool"}, + "spi": {"type": "int"}, + "passphrase": { + "type": "str", + "no_log": True, + }, + }, + }, + }, + }, + "address_family": { + "elements": "dict", + "type": "list", + "options": { + "router_id": {"type": "str"}, + "distance": {"type": "int"}, + "redistribute": { + "elements": "dict", + "type": "list", + "options": { + "routes": { + "type": "str", + "choices": [ + "bgp", + "connected", + "static", + ], + }, + "route_map": {"type": "str"}, + }, + }, + "default_information": { + "type": "dict", + "options": { + "metric_type": {"type": "int"}, + "always": {"type": "bool"}, + "metric": {"type": "int"}, + "originate": {"type": "bool"}, + "route_map": {"type": "str"}, + }, + }, + "afi": { + "choices": ["ipv4", "ipv6"], + "type": "str", + }, + "fips_restrictions": {"type": "bool"}, + "default_metric": {"type": "int"}, + "maximum_paths": {"type": "int"}, + "adjacency": { + "type": "dict", + "options": { + "exchange_start": { + "type": "dict", + "options": { + "threshold": {"type": "int"}, + }, + }, + }, + }, + "max_metric": { + "type": "dict", + "options": { + "router_lsa": { + "type": "dict", + "options": { + "external_lsa": { + "type": "dict", + "options": { + "set": { + "type": "bool", + }, + "max_metric_value": { + "type": "int", + }, + }, + }, + "summary_lsa": { + "type": "dict", + "options": { + "set": { + "type": "bool", + }, + "max_metric_value": { + "type": "int", + }, + }, + }, + "set": {"type": "bool"}, + "on_startup": { + "type": "dict", + "options": { + "wait_for_bgp": { + "type": "bool", + }, + "wait_period": { + "type": "int", + }, + }, + }, + "include_stub": { + "type": "bool", + }, + }, + }, + }, + }, + "log_adjacency_changes": { + "type": "dict", + "options": { + "set": {"type": "bool"}, + "detail": {"type": "bool"}, + }, + }, + "timers": { + "type": "dict", + "options": { + "throttle": { + "type": "dict", + "options": { + "max": {"type": "int"}, + "initial": {"type": "int"}, + "min": {"type": "int"}, + "spf": {"type": "bool"}, + "lsa": {"type": "bool"}, + }, + }, + "spf": { + "type": "dict", + "options": { + "max": {"type": "int"}, + "initial": {"type": "int"}, + "min": {"type": "int"}, + }, + }, + "lsa": { + "type": "raw", + "options": { + "max": {"type": "int"}, + "initial": {"type": "int"}, + "min": {"type": "int"}, + "direction": { + "type": "str", + "choices": ["rx", "tx"], + }, + }, + }, + "out_delay": {"type": "int"}, + "pacing": {"type": "int"}, + }, + }, + "shutdown": {"type": "bool"}, + "auto_cost": { + "type": "dict", + "options": { + "reference_bandwidth": {"type": "int"}, + }, + }, + "graceful_restart_helper": {"type": "bool"}, + "passive_interface": {"type": "bool"}, + "bfd": { + "type": "dict", + "options": { + "all_interfaces": {"type": "bool"}, + }, + }, + "areas": { + "elements": "dict", + "type": "list", + "options": { + "ranges": { + "elements": "dict", + "type": "list", + "options": { + "subnet_mask": {"type": "str"}, + "advertise": {"type": "bool"}, + "cost": {"type": "int"}, + "subnet_address": { + "type": "str", + }, + "address": {"type": "str"}, + }, + }, + "area_id": {"type": "str"}, + "encryption": { + "type": "dict", + "options": { + "hidden_key": {"type": "bool"}, + "key": { + "type": "str", + "no_log": True, + }, + "algorithm": { + "type": "str", + "choices": ["sha1", "md5"], + }, + "encrypt_key": { + "type": "bool", + }, + "encryption": { + "type": "str", + "choices": [ + "3des-cbc", + "aes-128-cbc", + "aes-192-cbc", + "aes-256-cbc", + "null", + ], + }, + "spi": {"type": "int"}, + "passphrase": { + "type": "str", + "no_log": True, + }, + }, + }, + "nssa": { + "type": "dict", + "options": { + "translate": {"type": "bool"}, + "default_information_originate": { + "type": "dict", + "options": { + "metric_type": { + "type": "int", + }, + "metric": { + "type": "int", + }, + "nssa_only": { + "type": "bool", + }, + "set": { + "type": "bool", + }, + }, + }, + "nssa_only": {"type": "bool"}, + "set": {"type": "bool"}, + "no_summary": {"type": "bool"}, + }, + }, + "stub": { + "type": "dict", + "options": { + "summary_lsa": { + "type": "bool", + }, + "set": {"type": "bool"}, + }, + }, + "default_cost": {"type": "int"}, + "authentication": { + "type": "dict", + "options": { + "hidden_key": {"type": "bool"}, + "key": { + "type": "str", + "no_log": True, + }, + "algorithm": { + "type": "str", + "choices": ["md5", "sha1"], + }, + "encrypt_key": { + "type": "bool", + }, + "spi": {"type": "int"}, + "passphrase": { + "type": "str", + "no_log": True, + }, + }, + }, + }, + }, + "graceful_restart": { + "type": "dict", + "options": { + "grace_period": {"type": "int"}, + "set": {"type": "bool"}, + }, + }, + }, + }, + }, + }, + }, + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/prefix_lists/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/prefix_lists/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/prefix_lists/prefix_lists.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/prefix_lists/prefix_lists.py new file mode 100644 index 000000000..665c899a2 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/prefix_lists/prefix_lists.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the +# cli_rm_builder. +# +# Manually editing this file is not advised. +# +# To update the argspec make the desired changes +# in the module docstring and re-run +# cli_rm_builder. +# +############################################# + +""" +The arg spec for the eos_prefix_lists module +""" + + +class Prefix_listsArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_prefix_lists module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "type": "list", + "elements": "dict", + "options": { + "afi": { + "type": "str", + "required": True, + "choices": ["ipv4", "ipv6"], + }, + "prefix_lists": { + "type": "list", + "elements": "dict", + "options": { + "name": {"type": "str", "required": True}, + "entries": { + "type": "list", + "elements": "dict", + "options": { + "action": { + "type": "str", + "choices": ["deny", "permit"], + }, + "address": {"type": "str"}, + "match": { + "type": "dict", + "options": { + "operator": { + "type": "str", + "choices": ["eq", "le", "ge"], + }, + "masklen": {"type": "int"}, + }, + }, + "sequence": {"type": "int"}, + "resequence": { + "type": "dict", + "options": { + "default": {"type": "bool"}, + "start_seq": {"type": "int"}, + "step": {"type": "int"}, + }, + }, + }, + }, + }, + }, + }, + }, + "running_config": {"type": "str"}, + "state": { + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/route_maps/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/route_maps/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/route_maps/route_maps.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/route_maps/route_maps.py new file mode 100644 index 000000000..ab6cb7574 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/route_maps/route_maps.py @@ -0,0 +1,367 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_route_maps module +""" + + +class Route_mapsArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_route_maps module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "running_config": {"type": "str"}, + "state": { + "default": "merged", + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + }, + "config": { + "elements": "dict", + "type": "list", + "options": { + "route_map": {"type": "str"}, + "entries": { + "elements": "dict", + "type": "list", + "options": { + "set": { + "type": "dict", + "options": { + "extcommunity": { + "type": "dict", + "options": { + "rt": { + "type": "dict", + "options": { + "vpn": {"type": "str"}, + "additive": {"type": "bool"}, + "delete": {"type": "bool"}, + }, + }, + "none": {"type": "bool"}, + "soo": { + "type": "dict", + "options": { + "vpn": {"type": "str"}, + "additive": {"type": "bool"}, + "delete": {"type": "bool"}, + }, + }, + "lbw": { + "type": "dict", + "options": { + "aggregate": {"type": "bool"}, + "divide": { + "type": "str", + "choices": [ + "equal", + "ration", + ], + }, + "value": {"type": "str"}, + }, + }, + }, + }, + "origin": { + "type": "str", + "choices": ["egp", "igp", "incomplete"], + }, + "isis_level": {"type": "str"}, + "weight": {"type": "int"}, + "distance": {"type": "int"}, + "ip": { + "type": "dict", + "options": { + "peer_address": {"type": "bool"}, + "unchanged": {"type": "bool"}, + "address": {"type": "str"}, + }, + }, + "metric": { + "type": "dict", + "options": { + "add": { + "type": "str", + "choices": [ + "igp-metric", + "igp-nexthop-cost", + ], + }, + "igp_param": { + "type": "str", + "choices": [ + "igp-metric", + "igp-nexthop-cost", + ], + }, + "value": {"type": "str"}, + }, + }, + "nexthop": { + "type": "dict", + "options": { + "value": {"type": "int"}, + "max_metric": {"type": "bool"}, + }, + }, + "as_path": { + "type": "dict", + "options": { + "match": { + "type": "dict", + "options": { + "as_number": {"type": "str"}, + "none": {"type": "bool"}, + }, + }, + "prepend": { + "type": "dict", + "options": { + "last_as": {"type": "int"}, + "as_number": {"type": "str"}, + }, + }, + }, + }, + "community_attributes": { + "type": "dict", + "options": { + "none": {"type": "bool"}, + "graceful_shutdown": {"type": "bool"}, + "community": { + "type": "dict", + "options": { + "additive": {"type": "bool"}, + "local_as": {"type": "bool"}, + "no_export": {"type": "bool"}, + "list": {"type": "str"}, + "number": {"type": "str"}, + "no_advertise": { + "type": "bool", + }, + "internet": {"type": "bool"}, + "graceful_shutdown": { + "type": "bool", + }, + "delete": {"type": "bool"}, + }, + }, + }, + }, + "bgp": {"type": "int"}, + "tag": {"type": "int"}, + "local_preference": {"type": "int"}, + "segment_index": {"type": "int"}, + "ipv6": { + "type": "dict", + "options": { + "peer_address": {"type": "bool"}, + "unchanged": {"type": "bool"}, + "address": {"type": "str"}, + }, + }, + "metric_type": { + "type": "str", + "choices": ["type-1", "type-2"], + }, + "evpn": {"type": "bool"}, + }, + }, + "description": {"type": "str"}, + "sequence": {"type": "int"}, + "source": {"type": "dict"}, + "continue_sequence": {"type": "int"}, + "statement": {"type": "str"}, + "action": { + "type": "str", + "choices": ["deny", "permit"], + }, + "sub_route_map": { + "type": "dict", + "options": { + "name": {"type": "str"}, + "invert_result": {"type": "bool"}, + }, + }, + "match": { + "type": "dict", + "options": { + "extcommunity": { + "type": "dict", + "options": { + "community_list": {"type": "str"}, + "exact_match": {"type": "bool"}, + }, + }, + "router_id": {"type": "str"}, + "invert_result": { + "type": "dict", + "options": { + "extcommunity": { + "type": "dict", + "options": { + "community_list": { + "type": "str", + }, + "exact_match": { + "type": "bool", + }, + }, + }, + "large_community": { + "type": "dict", + "options": { + "community_list": { + "type": "str", + }, + "exact_match": { + "type": "bool", + }, + }, + }, + "aggregate_role": { + "type": "dict", + "options": { + "contributor": { + "type": "bool", + }, + "route_map": {"type": "str"}, + }, + }, + "as_path": { + "type": "dict", + "options": { + "path_list": {"type": "str"}, + "length": {"type": "str"}, + }, + }, + "community": { + "type": "dict", + "options": { + "community_list": { + "type": "str", + }, + "instances": {"type": "str"}, + "exact_match": { + "type": "bool", + }, + }, + }, + }, + }, + "large_community": { + "type": "dict", + "options": { + "community_list": {"type": "str"}, + "exact_match": {"type": "bool"}, + }, + }, + "ip": { + "type": "dict", + "options": { + "resolved_next_hop": {"type": "str"}, + "next_hop": {"type": "str"}, + "address": { + "type": "dict", + "options": { + "prefix_list": {"type": "str"}, + "dynamic": {"type": "bool"}, + "access_list": {"type": "str"}, + }, + }, + }, + }, + "aggregate_role": { + "type": "dict", + "options": { + "contributor": {"type": "bool"}, + "route_map": {"type": "str"}, + }, + }, + "isis_level": {"type": "str"}, + "community": { + "type": "dict", + "options": { + "community_list": {"type": "str"}, + "instances": {"type": "str"}, + "exact_match": {"type": "bool"}, + }, + }, + "as_path": { + "type": "dict", + "options": { + "path_list": {"type": "str"}, + "length": {"type": "str"}, + }, + }, + "route_type": {"type": "str"}, + "as": {"type": "int"}, + "tag": {"type": "int"}, + "local_preference": {"type": "int"}, + "ipv6": { + "type": "dict", + "options": { + "resolved_next_hop": {"type": "str"}, + "next_hop": {"type": "str"}, + "address": { + "type": "dict", + "options": { + "prefix_list": {"type": "str"}, + "dynamic": {"type": "bool"}, + "access_list": {"type": "str"}, + }, + }, + }, + }, + "metric_type": { + "type": "str", + "choices": ["type-1", "type-2"], + }, + "interface": {"type": "str"}, + "source_protocol": {"type": "str"}, + "metric": {"type": "int"}, + }, + }, + }, + }, + }, + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/snmp_server/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/snmp_server/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/snmp_server/snmp_server.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/snmp_server/snmp_server.py new file mode 100644 index 000000000..654201e44 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/snmp_server/snmp_server.py @@ -0,0 +1,389 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the +# cli_rm_builder. +# +# Manually editing this file is not advised. +# +# To update the argspec make the desired changes +# in the module docstring and re-run +# cli_rm_builder. +# +############################################# + +""" +The arg spec for the eos_snmp_server module +""" + + +class Snmp_serverArgs(object): # pylint: disable=R0903 + """The arg spec for the eos_snmp_server module""" + + argument_spec = { + "config": { + "type": "dict", + "options": { + "chassis_id": {"type": "str"}, + "communities": { + "type": "list", + "elements": "dict", + "options": { + "name": {"type": "str"}, + "acl_v4": {"type": "str"}, + "acl_v6": {"type": "str"}, + "ro": {"type": "bool"}, + "rw": {"type": "bool"}, + "view": {"type": "str"}, + }, + }, + "contact": {"type": "str"}, + "traps": { + "type": "dict", + "options": { + "bgp": { + "type": "dict", + "options": { + "arista_backward_transition": {"type": "bool"}, + "arista_established": {"type": "bool"}, + "backward_transition": {"type": "bool"}, + "established": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "bridge": { + "type": "dict", + "options": { + "arista_mac_age": {"type": "bool"}, + "arista_mac_learn": {"type": "bool"}, + "arista_mac_move": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "capacity": { + "type": "dict", + "options": { + "arista_hardware_utilization_alert": { + "type": "bool", + }, + "enabled": {"type": "bool"}, + }, + }, + "entity": { + "type": "dict", + "options": { + "arista_ent_sensor_alarm": {"type": "bool"}, + "ent_config_change": {"type": "bool"}, + "ent_state_oper": {"type": "bool"}, + "ent_state_oper_disabled": {"type": "bool"}, + "ent_state_oper_enabled": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "external_alarm": { + "type": "dict", + "options": { + "arista_external_alarm_asserted_notif": { + "type": "bool", + }, + "arista_external_alarm_deasserted_notif": { + "type": "bool", + }, + "enabled": {"type": "bool"}, + }, + }, + "isis": { + "type": "dict", + "options": { + "adjacency_change": {"type": "bool"}, + "area_mismatch": {"type": "bool"}, + "attempt_to_exceed_max_sequence": { + "type": "bool", + }, + "authentication_type_failure": { + "type": "bool", + }, + "database_overload": {"type": "bool"}, + "own_lsp_purge": {"type": "bool"}, + "rejected_adjacency": {"type": "bool"}, + "sequence_number_skip": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "lldp": { + "type": "dict", + "options": { + "rem_tables_change": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "mpls_ldp": { + "type": "dict", + "options": { + "mpls_ldp_session_down": {"type": "bool"}, + "mpls_ldp_session_up": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "msdp": { + "type": "dict", + "options": { + "backward_transition": {"type": "bool"}, + "established": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "ospf": { + "type": "dict", + "options": { + "if_config_error": {"type": "bool"}, + "if_auth_failure": {"type": "bool"}, + "if_state_change": {"type": "bool"}, + "nbr_state_change": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "ospfv3": { + "type": "dict", + "options": { + "if_config_error": {"type": "bool"}, + "if_rx_bad_packet": {"type": "bool"}, + "if_state_change": {"type": "bool"}, + "nbr_state_change": {"type": "bool"}, + "nbr_restart_helper_status_change": { + "type": "bool", + }, + "nssa_translator_status_change": { + "type": "bool", + }, + "restart_status_change": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "pim": { + "type": "dict", + "options": { + "neighbor_loss": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "snmp": { + "type": "dict", + "options": { + "authentication": {"type": "bool"}, + "link_down": {"type": "bool"}, + "link_up": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "snmpConfigManEvent": { + "type": "dict", + "options": { + "arista_config_man_event": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "switchover": { + "type": "dict", + "options": { + "arista_redundancy_switch_over_notif": { + "type": "bool", + }, + "enabled": {"type": "bool"}, + }, + }, + "test": { + "type": "dict", + "options": { + "arista_test_notification": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + "vrrp": { + "type": "dict", + "options": { + "trap_new_master": {"type": "bool"}, + "enabled": {"type": "bool"}, + }, + }, + }, + }, + "engineid": { + "type": "dict", + "options": { + "local": {"type": "str"}, + "remote": { + "type": "dict", + "options": { + "host": {"type": "str"}, + "udp_port": {"type": "int"}, + "id": {"type": "str"}, + }, + }, + }, + }, + "extension": { + "type": "dict", + "options": { + "root_oid": {"type": "str"}, + "script_location": {"type": "str"}, + "oneshot": {"type": "bool"}, + }, + }, + "groups": { + "type": "list", + "elements": "dict", + "options": { + "group": {"type": "str"}, + "version": { + "type": "str", + "choices": ["v1", "v3", "v2c"], + }, + "auth_privacy": { + "type": "str", + "choices": ["auth", "noauth", "priv"], + }, + "context": {"type": "str"}, + "notify": {"type": "str"}, + "read": {"type": "str"}, + "write": {"type": "str"}, + }, + }, + "hosts": { + "type": "list", + "elements": "dict", + "options": { + "host": {"type": "str"}, + "user": {"type": "str"}, + "udp_port": {"type": "int"}, + "informs": {"type": "bool"}, + "traps": {"type": "bool"}, + "version": { + "type": "str", + "choices": [ + "1", + "2c", + "3 auth", + "3 noauth", + "3 priv", + ], + }, + "vrf": {"type": "str"}, + }, + }, + "acls": { + "type": "list", + "elements": "dict", + "options": { + "afi": {"type": "str", "choices": ["ipv4", "ipv6"]}, + "acl": {"type": "str"}, + "vrf": {"type": "str"}, + }, + }, + "local_interface": {"type": "str"}, + "location": {"type": "str"}, + "notification": {"type": "int"}, + "objects": { + "type": "dict", + "options": { + "mac_address_tables": {"type": "bool"}, + "route_tables": {"type": "bool"}, + }, + }, + "qos": {"type": "int"}, + "qosmib": {"type": "int"}, + "transmit": {"type": "int"}, + "transport": {"type": "str"}, + "users": { + "type": "list", + "elements": "dict", + "options": { + "user": {"type": "str"}, + "group": {"type": "str"}, + "remote": {"type": "str"}, + "udp_port": {"type": "int"}, + "version": { + "type": "str", + "choices": ["v1", "v2c", "v3"], + }, + "auth": { + "type": "dict", + "options": { + "algorithm": {"type": "str"}, + "auth_passphrase": { + "type": "str", + "no_log": True, + }, + "encryption": {"type": "str"}, + "priv_passphrase": { + "type": "str", + "no_log": True, + }, + }, + }, + "localized": { + "type": "dict", + "options": { + "engineid": {"type": "str"}, + "algorithm": {"type": "str"}, + "auth_passphrase": { + "type": "str", + "no_log": True, + }, + "encryption": {"type": "str"}, + "priv_passphrase": { + "type": "str", + "no_log": True, + }, + }, + }, + }, + }, + "views": { + "type": "list", + "elements": "dict", + "options": { + "view": {"type": "str"}, + "mib": {"type": "str"}, + "action": { + "type": "str", + "choices": ["excluded", "included"], + }, + }, + }, + "vrfs": { + "type": "list", + "elements": "dict", + "options": { + "vrf": {"type": "str"}, + "local_interface": {"type": "str"}, + }, + }, + }, + }, + "running_config": {"type": "str"}, + "state": { + "type": "str", + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/static_routes/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/static_routes/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/static_routes/static_routes.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/static_routes/static_routes.py new file mode 100644 index 000000000..86d790606 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/static_routes/static_routes.py @@ -0,0 +1,97 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# +""" +The arg spec for the eos_static_routes module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class Static_routesArgs(object): + """The arg spec for the eos_static_routes module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "address_families": { + "elements": "dict", + "options": { + "afi": { + "choices": ["ipv4", "ipv6"], + "required": True, + "type": "str", + }, + "routes": { + "elements": "dict", + "options": { + "dest": {"required": True, "type": "str"}, + "next_hops": { + "elements": "dict", + "options": { + "admin_distance": {"type": "int"}, + "description": {"type": "str"}, + "forward_router_address": { + "type": "str", + }, + "interface": {"type": "str"}, + "nexthop_grp": {"type": "str"}, + "mpls_label": {"type": "int"}, + "tag": {"type": "int"}, + "track": {"type": "str"}, + "vrf": {"type": "str"}, + }, + "type": "list", + }, + }, + "type": "list", + }, + }, + "type": "list", + }, + "vrf": {"type": "str"}, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "deleted", + "merged", + "overridden", + "replaced", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } # pylint: disable=C0301 diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/vlans/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/vlans/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/vlans/vlans.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/vlans/vlans.py new file mode 100644 index 000000000..5bdefddb0 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/argspec/vlans/vlans.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +############################################# +# WARNING # +############################################# +# +# This file is auto generated by the resource +# module builder playbook. +# +# Do not edit this file manually. +# +# Changes to this file will be over written +# by the resource module builder. +# +# Changes should be made in the model used to +# generate this file or in the resource module +# builder template. +# +############################################# + +""" +The arg spec for the eos_vlans module +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +class VlansArgs(object): + """The arg spec for the eos_vlans module""" + + def __init__(self, **kwargs): + pass + + argument_spec = { + "config": { + "elements": "dict", + "options": { + "vlan_id": {"required": True, "type": "int"}, + "name": {"type": "str"}, + "state": {"choices": ["active", "suspend"], "type": "str"}, + }, + "type": "list", + }, + "running_config": {"type": "str"}, + "state": { + "choices": [ + "merged", + "replaced", + "overridden", + "deleted", + "gathered", + "rendered", + "parsed", + ], + "default": "merged", + "type": "str", + }, + } diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acl_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acl_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acl_interfaces/acl_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acl_interfaces/acl_interfaces.py new file mode 100644 index 000000000..c76e79595 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acl_interfaces/acl_interfaces.py @@ -0,0 +1,481 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_acl_interfaces class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import itertools + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + search_obj_in_list, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) + + +class Acl_interfaces(ConfigBase): + """ + The eos_acl_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["acl_interfaces"] + + def __init__(self, module): + super(Acl_interfaces, self).__init__(module) + + def get_acl_interfaces_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + acl_interfaces_facts = facts["ansible_network_resources"].get( + "acl_interfaces", + ) + if not acl_interfaces_facts: + return [] + return acl_interfaces_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + changed = False + + if self.state in self.ACTION_STATES: + existing_acl_interfaces_facts = self.get_acl_interfaces_facts() + else: + existing_acl_interfaces_facts = [] + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_acl_interfaces_facts)) + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + changed = True + if changed: + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_acl_interfaces_facts = self.get_acl_interfaces_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + if not self._module.params["running_config"]: + self._module.fail_json( + msg="Value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_acl_interfaces_facts( + data=self._module.params["running_config"], + ) + else: + changed_acl_interfaces_facts = [] + if self.state in self.ACTION_STATES: + result["before"] = existing_acl_interfaces_facts + if result["changed"]: + result["after"] = changed_acl_interfaces_facts + elif self.state == "gathered": + result["gathered"] = changed_acl_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_acl_interfaces_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_acl_interfaces_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + if self.state in ("merged", "replaced", "overridden") and not want: + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + self.state, + ), + ) + state = self._module.params["state"] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or self.state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + def _state_replaced(self, want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commandset = [] + want_interface = [] + for w in want: + commands = [] + diff_access_group = [] + want_interface.append(w["name"]) + obj_in_have = search_obj_in_list(w["name"], have, "name") + if not obj_in_have or "access_groups" not in obj_in_have.keys(): + commands.append(add_commands(w["access_groups"], w["name"])) + else: + if "access_groups" in obj_in_have.keys(): + obj = self.get_acl_diff(obj_in_have, w) + if obj[0]: + to_delete = { + "access_groups": [{"acls": obj[0], "afi": "ipv4"}], + } + commands.append(remove_commands(to_delete, w["name"])) + if obj[1]: + to_delete = { + "access_groups": [{"acls": obj[1], "afi": "ipv6"}], + } + commands.append(remove_commands(to_delete, w["name"])) + diff = self.get_acl_diff(w, obj_in_have) + if diff[0]: + diff_access_group.append( + {"afi": "ipv4", "acls": diff[0]}, + ) + if diff[1]: + diff_access_group.append( + {"afi": "ipv6", "acls": diff[1]}, + ) + if diff_access_group: + commands.append( + add_commands(diff_access_group, w["name"]), + ) + if commands: + intf_command = ["interface " + w["name"]] + commands = list(itertools.chain(*commands)) + commandset.append(intf_command) + commandset.append(commands) + + if commandset: + commandset = list(itertools.chain(*commandset)) + return commandset + + def _state_overridden(self, want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commandset = [] + want_interface = [] + for w in want: + commands = [] + diff_access_group = [] + want_interface.append(w["name"]) + obj_in_have = search_obj_in_list(w["name"], have, "name") + if not obj_in_have or "access_groups" not in obj_in_have.keys(): + commands.append(add_commands(w["access_groups"], w["name"])) + else: + if "access_groups" in obj_in_have.keys(): + obj = self.get_acl_diff(obj_in_have, w) + if obj[0]: + to_delete = { + "access_groups": [{"acls": obj[0], "afi": "ipv4"}], + } + commands.append(remove_commands(to_delete, w["name"])) + if obj[1]: + to_delete = { + "access_groups": [{"acls": obj[1], "afi": "ipv6"}], + } + commands.append(remove_commands(to_delete, w["name"])) + diff = self.get_acl_diff(w, obj_in_have) + if diff[0]: + diff_access_group.append( + {"afi": "ipv4", "acls": diff[0]}, + ) + if diff[1]: + diff_access_group.append( + {"afi": "ipv6", "acls": diff[1]}, + ) + if diff_access_group: + commands.append( + add_commands(diff_access_group, w["name"]), + ) + if commands: + intf_command = ["interface " + w["name"]] + commands = list(itertools.chain(*commands)) + commandset.append(intf_command) + commandset.append(commands) + for h in have: + commands = [] + if "access_groups" in h.keys() and h["access_groups"]: + if h["name"] not in want_interface: + for h_group in h["access_groups"]: + to_delete = {"access_groups": [h_group]} + commands.append(remove_commands(to_delete, h["name"])) + if commands: + intf_command = ["interface " + h["name"]] + commands = list(itertools.chain(*commands)) + commandset.append(intf_command) + commandset.append(commands) + + if commandset: + commandset = list(itertools.chain(*commandset)) + + return commandset + + def _state_merged(self, want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commandset = [] + for w in want: + commands = [] + diff_access_group = [] + obj_in_have = search_obj_in_list(w["name"], have, "name") + if not obj_in_have: + commands = add_commands(w["access_groups"], w["name"]) + else: + if "access_groups" in obj_in_have.keys(): + diff = self.get_acl_diff(w, obj_in_have) + if diff[0]: + diff_access_group.append( + {"afi": "ipv4", "acls": diff[0]}, + ) + if diff[1]: + diff_access_group.append( + {"afi": "ipv6", "acls": diff[1]}, + ) + if diff_access_group: + commands = add_commands(diff_access_group, w["name"]) + else: + commands = add_commands(w["access_groups"], w["name"]) + if commands: + intf_command = ["interface " + w["name"]] + commandset.append(intf_command) + commandset.append(commands) + if commandset: + commandset = list(itertools.chain(*commandset)) + return commandset + + def _state_deleted(self, want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commandset = [] + for w in want: + commands = [] + intf_command = ["interface " + w["name"]] + obj_in_have = search_obj_in_list(w["name"], have, "name") + if "access_groups" not in w.keys() or not w["access_groups"]: + commands = remove_commands(obj_in_have, w["name"]) + if w["access_groups"]: + for w_grp in w["access_groups"]: + if "acls" not in w_grp.keys() or not w_grp["acls"]: + obj = self.get_acls_from_afi( + w["name"], + w_grp["afi"], + have, + ) + to_delete = { + "access_groups": [ + {"acls": obj, "afi": w_grp["afi"]}, + ], + } + commands = remove_commands(to_delete, w["name"]) + else: + if ( + "access_groups" not in obj_in_have.keys() + or not obj_in_have["access_groups"] + ): + continue + group = {"access_groups": [w_grp]} + obj = self.get_acl_diff(group, obj_in_have, True) + if obj[0]: + to_delete = { + "access_groups": [ + {"acls": obj[0], "afi": "ipv4"}, + ], + } + commands.append( + remove_commands(to_delete, w["name"]), + ) + if obj[1]: + to_delete = { + "access_groups": [ + {"acls": obj[1], "afi": "ipv6"}, + ], + } + commands.append( + remove_commands(to_delete, w["name"]), + ) + if commands: + commands = list(itertools.chain(*commands)) + if commands: + commandset.append(intf_command) + commandset.append(commands) + + if commandset: + commandset = list(itertools.chain(*commandset)) + return commandset + + def get_acl_diff(self, w, h, intersection=False): + diff_v4 = [] + diff_v6 = [] + w_acls_v4 = [] + w_acls_v6 = [] + h_acls_v4 = [] + h_acls_v6 = [] + for w_group in w["access_groups"]: + if w_group["afi"] == "ipv4": + w_acls_v4 = w_group["acls"] + if w_group["afi"] == "ipv6": + w_acls_v6 = w_group["acls"] + for h_group in h["access_groups"]: + if h_group["afi"] == "ipv4": + h_acls_v4 = h_group["acls"] + if h_group["afi"] == "ipv6": + h_acls_v6 = h_group["acls"] + for item in w_acls_v4: + match = list( + filter(lambda x: x["name"] == item["name"], h_acls_v4), + ) + if match: + if item["direction"] == match[0]["direction"]: + if intersection: + diff_v4.append(item) + else: + if not intersection: + diff_v4.append(item) + else: + if not intersection: + diff_v4.append(item) + for item in w_acls_v6: + match = list( + filter(lambda x: x["name"] == item["name"], h_acls_v6), + ) + if match: + if item["direction"] == match[0]["direction"]: + if intersection: + diff_v6.append(item) + else: + if not intersection: + diff_v6.append(item) + else: + if not intersection: + diff_v6.append(item) + return diff_v4, diff_v6 + + def get_acls_from_afi(self, interface, afi, have): + config = [] + for h in have: + if h["name"] == interface: + if "access_groups" not in h.keys() or not h["access_groups"]: + continue + if h["access_groups"]: + for h_grp in h["access_groups"]: + if h_grp["afi"] == afi: + config = h_grp["acls"] + return config + + +def add_commands(want, interface): + commands = [] + + for w in want: + # This module was verified on an ios device since vEOS doesnot support + # acl_interfaces cnfiguration. In ios, ipv6 acl is configured as + # traffic-filter and in eos it is access-group + + # a_cmd = "traffic-filter" if w['afi'] == 'ipv6' else "access-group" + a_cmd = "access-group" + afi = "ip" if w["afi"] == "ipv4" else w["afi"] + if "acls" in w.keys(): + for acl in w["acls"]: + commands.append( + afi + + " " + + a_cmd + + " " + + acl["name"] + + " " + + acl["direction"], + ) + return commands + + +def remove_commands(want, interface): + commands = [] + if "access_groups" not in want.keys() or not want["access_groups"]: + return commands + for w in want["access_groups"]: + # This module was verified on an ios device since vEOS doesnot support + # acl_interfaces cnfiguration. In ios, ipv6 acl is configured as + # traffic-filter and in eos it is access-group + + # a_cmd = "traffic-filter" if w['afi'] == 'ipv6' else "access-group" + a_cmd = "access-group" + + afi = "ip" if w["afi"] == "ipv4" else w["afi"] + if "acls" in w.keys(): + for acl in w["acls"]: + commands.append( + "no " + + afi + + " " + + a_cmd + + " " + + acl["name"] + + " " + + acl["direction"], + ) + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acls/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acls/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acls/acls.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acls/acls.py new file mode 100644 index 000000000..17fe6cfd3 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/acls/acls.py @@ -0,0 +1,661 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_acls class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import itertools +import re +import socket + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + remove_empties, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) + + +class Acls(ConfigBase): + """ + The eos_acls class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["acls"] + + def __init__(self, module): + super(Acls, self).__init__(module) + + def get_acls_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + acls_facts = facts["ansible_network_resources"].get("acls") + if not acls_facts: + return [] + return acls_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + changed = False + + if self.state in self.ACTION_STATES: + existing_acls_facts = self.get_acls_facts() + else: + existing_acls_facts = [] + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_acls_facts)) + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + changed = True + if changed: + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_acls_facts = self.get_acls_facts() + elif self.state == "rendered": + commands = list(itertools.chain(*commands)) + result["rendered"] = commands + elif self.state == "parsed": + if not self._module.params["running_config"]: + self._module.fail_json( + msg="Value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_acls_facts( + data=self._module.params["running_config"], + ) + else: + changed_acls_facts = [] + if self.state in self.ACTION_STATES: + result["before"] = existing_acls_facts + if result["changed"]: + result["after"] = changed_acls_facts + elif self.state == "gathered": + result["gathered"] = changed_acls_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_acls_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + config = self._module.params.get("config") + want = [] + onbox_configs = [] + for h in existing_acls_facts: + have_configs = add_commands(remove_empties(h)) + onbox_configs.append(have_configs) + if config: + for w in config: + want.append(remove_empties(w)) + have = existing_acls_facts + resp = self.set_state(want, have) + if self.state == "merged": + to_config = self.compare_configs(onbox_configs, to_list(resp)) + else: + to_config = resp + return to_config + + def compare_configs(self, have, want): + commands = [] + want = list(itertools.chain(*want)) + have = list(itertools.chain(*have)) + h_index = 0 + config = list(want) + for w in want: + access_list = re.findall(r"(ip.*) access-list (.*)", w) + if access_list: + if w in have: + h_index = have.index(w) + else: + for num, h in enumerate(have, start=h_index + 1): + if "access-list" not in h: + seq_num = re.search(r"(\d+) (.*)", w) + if seq_num: + have_seq_num = re.search(r"(\d+) (.*)", h) + if seq_num.group(1) == have_seq_num.group( + 1, + ) and have_seq_num.group(2) != seq_num.group(2): + negate_cmd = "no " + seq_num.group(1) + config.insert(config.index(w), negate_cmd) + if w in h: + config.pop(config.index(w)) + break + for c in config: + access_list = re.findall(r"(ip.*) access-list (.*)", c) + if access_list: + acl_index = config.index(c) + else: + if config[acl_index] not in commands: + commands.append(config[acl_index]) + commands.append(c) + return commands + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + if ( + self.state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + self.state, + ), + ) + state = self._module.params["state"] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or self.state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + def _state_replaced(self, want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + config_cmds = [] + remove_cmds = [] + ace_names = [] + diff = {} + if not have: + commands = set_commands(want, []) + for w in want: + afi = "ipv6" if w["afi"] == "ipv6" else "ipv4" + for acl in w["acls"]: + name = acl["name"] + want_ace = acl["aces"] + for h in have: + if h["afi"] == afi: + for h_acl in h["acls"]: + if h_acl["name"] == name: + if name not in ace_names: + ace_names.append(name) + h = {"afi": afi, "acls": [{"name": name}]} + for h_ace in h_acl.get("aces", []): + diff = get_ace_diff(h_ace, want_ace) + if diff: + h = { + "afi": afi, + "acls": [ + { + "name": name, + "aces": [h_ace], + }, + ], + } + remove_cmds.append( + del_commands(h, have), + ) + for w_ace in want_ace: + w_diff = get_ace_diff( + w_ace, + h_acl.get("aces", []), + ) + if w_diff: + w = [ + { + "afi": afi, + "acls": [ + { + "name": name, + "aces": [w_ace], + }, + ], + }, + ] + cmds = set_commands(w, have) + config_cmds.append( + list(itertools.chain(*cmds)), + ) + if name not in ace_names: + for w_ace in want_ace: + w = [ + { + "afi": afi, + "acls": [ + { + "name": name, + "aces": [w_ace], + }, + ], + }, + ] + cmds = set_commands(w, have) + config_cmds.append( + list(itertools.chain(*cmds)), + ) + + if remove_cmds: + remove_cmds = list(itertools.chain(*remove_cmds)) + commands.append(remove_cmds) + if config_cmds: + config_cmds = list(itertools.chain(*config_cmds)) + commands.append(config_cmds) + commands = list(itertools.chain(*commands)) + commandset = [] + [commandset.append(cmd) for cmd in commands if cmd not in commandset] + return commandset + + def _state_overridden(self, want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + ace_diff = {} + h_afi_list = [] + w_afi_list = [] + for h in have: + h_afi_list.append(h["afi"]) + for w in want: + w_afi_list.append(w["afi"]) + if not h_afi_list: + commands = set_commands(want, []) + for hafi in h_afi_list: + if hafi not in w_afi_list: + h = {"afi": hafi} + remove_cmds = del_commands(h, have) + commands.append(remove_cmds) + for w in want: + w_names = [] + for h in have: + h_names = [] + if w["afi"] == h["afi"]: + for w_acl in w["acls"]: + for h_acl in h["acls"]: + h_names.append(h_acl["name"]) + if h_acl["name"] == w_acl["name"]: + for h_ace in h_acl.get("aces", []): + ace_diff = get_ace_diff( + h_ace, + w_acl["aces"], + ) + if ace_diff: + h = { + "afi": h["afi"], + "acls": [ + { + "name": h_acl["name"], + "aces": [h_ace], + }, + ], + } + remove_cmds = del_commands(h, have) + commands.append(remove_cmds) + for w_ace in w_acl["aces"]: + if w_acl["name"] not in w_names: + w_ace_diff = get_ace_diff( + w_ace, + h_acl.get("aces", []), + ) + if w_ace_diff: + w_diff = [ + { + "afi": w["afi"], + "acls": [ + { + "name": w_acl["name"], + "aces": [w_ace], + }, + ], + }, + ] + config_cmds = set_commands( + w_diff, + have, + ) + config_cmds = list( + itertools.chain(*config_cmds), + ) + commands.append(config_cmds) + w_names.append(w_acl["name"]) + for hname in h_names: + if hname not in w_names: + h = {"afi": h["afi"], "acls": [{"name": hname}]} + remove_cmds = del_commands(h, have) + if remove_cmds not in commands: + commands.append(remove_cmds) + + if commands: + commands = list(itertools.chain(*commands)) + + commandset = [] + for c in commands: + access_list = re.findall(r"(ip.*) access-list (.*)", c) + if access_list and "no" in c: + commandset.append(c) + continue + if access_list: + acl_index = commands.index(c) + else: + if commands[acl_index] not in commandset: + commandset.append(commands[acl_index]) + commandset.append(c) + + return commandset + + def _state_merged(self, want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + return set_commands(want, have) + + def _state_deleted(self, want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + if not want: + for h in have: + return_command = add_commands(h) + for command in return_command: + command = "no " + command + commands.append(command) + else: + for w in want: + return_command = del_commands(w, have, True) + if return_command[:5] == "Warn ": + self._module.warn(return_command[5:]) + return commands + else: + commands.append(return_command) + commands = list(itertools.chain(*commands)) + return commands + + +def set_commands(want, have): + commands = [] + for w in want: + wace_updated = [] + for h in have: + if w["afi"] == h["afi"]: + for wacl in w["acls"]: + for hacl in h["acls"]: + if wacl["name"] == hacl["name"]: + want_aces = wacl["aces"] + for wace in wacl["aces"]: + for hace in hacl.get("aces", []): + if ( + "sequence" in wace.keys() + and "sequence" in hace.keys() + ): + if ( + wace["sequence"] + == hace["sequence"] + ): + wace_updated = get_updated_ace( + wace, + hace, + ) + if wace_updated: + want_aces.pop( + want_aces.index(wace), + ) + want_aces.append(wace_updated) + return_command = add_commands(w) + commands.append(return_command) + return commands + + +def get_updated_ace(w, h): + # gives the ace to be updated in case of merge update. + if not dict_diff(w, h): + return + w_updated = w.copy() + for hkey in h.keys(): + if hkey not in w.keys(): + w_updated.update({hkey: h[hkey]}) + else: + w_updated.update({hkey: w[hkey]}) + return w_updated + + +def add_commands(want): + commandset = [] + protocol_name = { + "51": "ahp", + "47": "gre", + "1": "icmp", + "2": "igmp", + "4": "ip", + "89": "ospf", + "103": "pim", + "6": "tcp", + "17": "udp", + "112": "vrrp", + } + if not want: + return commandset + command = "" + afi = "ip" if want["afi"] == "ipv4" else "ipv6" + for acl in want["acls"]: + if "standard" in acl.keys() and acl["standard"]: + command = afi + " access-list standard " + acl["name"] + else: + command = afi + " access-list " + acl["name"] + commandset.append(command) + if "aces" not in acl.keys(): + continue + for ace in acl["aces"]: + command = "" + if "sequence" in ace.keys(): + command = str(ace["sequence"]) + if "remark" in ace.keys(): + command = command + " remark " + ace["remark"] + if "fragment_rules" in ace.keys() and ace["fragment_rules"]: + command = command + " fragment-rules" + if "grant" in ace.keys(): + command = command + " " + ace["grant"] + if "vlan" in ace.keys(): + command = command + " vlan " + ace["vlan"] + if "protocol" in ace.keys(): + protocol = ace["protocol"] + if protocol.isdigit(): + if protocol in protocol_name.keys(): + protocol = protocol_name[protocol] + command = command + " " + protocol + if "source" in ace.keys(): + if "any" in ace["source"].keys(): + command = command + " any" + elif "subnet_address" in ace["source"].keys(): + command = command + " " + ace["source"]["subnet_address"] + elif "host" in ace["source"].keys(): + command = command + " host " + ace["source"]["host"] + elif "address" in ace["source"].keys(): + command = ( + command + + " " + + ace["source"]["address"] + + " " + + ace["source"]["wildcard_bits"] + ) + if "port_protocol" in ace["source"].keys(): + for op, val in ace["source"]["port_protocol"].items(): + if val.isdigit(): + val = socket.getservbyport(int(val)) + command = ( + command + " " + op + " " + val.replace("_", "-") + ) + if "destination" in ace.keys(): + if "any" in ace["destination"].keys(): + command = command + " any" + elif "subnet_address" in ace["destination"].keys(): + command = ( + command + " " + ace["destination"]["subnet_address"] + ) + elif "host" in ace["destination"].keys(): + command = command + " host " + ace["destination"]["host"] + elif "address" in ace["destination"].keys(): + command = ( + command + + " " + + ace["destination"]["address"] + + " " + + ace["destination"]["wildcard_bits"] + ) + if "port_protocol" in ace["destination"].keys(): + for op in ace["destination"]["port_protocol"].keys(): + command = ( + command + + " " + + op + + " " + + ace["destination"]["port_protocol"][op].replace( + "_", + "-", + ) + ) + if "protocol_options" in ace.keys(): + for proto in ace["protocol_options"].keys(): + if proto == "icmp" or proto == "icmpv6": + for icmp_msg in ace["protocol_options"][proto].keys(): + command = ( + command + " " + icmp_msg.replace("_", "-") + ) + elif proto == "ip" or proto == "ipv6": + command = ( + command + + " nexthop-group " + + ace["protocol_options"][proto]["nexthop_group"] + ) + elif proto == "tcp": + for flag, val in ace["protocol_options"][proto][ + "flags" + ].items(): + if val: + command = command + " " + flag + if "hop_limit" in ace.keys(): + for op, val in ace["hop_limit"].items(): + command = command + " hop-limit " + op + " " + val + if "tracked" in ace.keys() and ace["tracked"]: + command = command + " tracked" + if "ttl" in ace.keys(): + for op, val in ace["ttl"].items(): + command = command + " ttl " + op + " " + str(val) + if "fragments" in ace.keys(): + command = command + " fragments" + if "log" in ace.keys(): + command = command + " log" + commandset.append(command.strip()) + return commandset + + +def del_commands(want, have, name_only=False): + commandset = [] + command = "" + have_command = [] + for h in have: + have_configs = add_commands(h) + have_command.append(have_configs) + have_command = list(itertools.chain(*have_command)) + afi = "ip" if want["afi"] == "ipv4" else "ipv6" + if "acls" not in want.keys(): + for have_cmd in have_command: + access_list = re.search(r"(ip.*)\s+access-list .*", have_cmd) + if access_list and access_list.group(1) == afi: + commandset.append("no " + have_cmd) + return commandset + + for acl in want["acls"]: + ace_present = True + if "standard" in acl.keys() and acl["standard"]: + command = afi + " access-list standard " + acl["name"] + else: + command = afi + " access-list " + acl["name"] + if "aces" not in acl.keys(): + ace_present = False + commandset.append("no " + command) + if ace_present: + if name_only: + msg = "Deleted operation allows deletion of access-list only and not the entries !!" + return "Warn " + msg + return_command = add_commands(want) + for cmd in return_command: + if "access-list" in cmd: + commandset.append(cmd) + continue + seq = re.search( + r"(\d+) (permit|deny|fragment-rules|remark) .*", + cmd, + ) + if seq: + commandset.append("no " + seq.group(1)) + else: + commandset.append("no " + cmd) + return commandset + + +def get_ace_diff(want_ace, have_ace): + # gives the diff of the aces passed. + if not have_ace: + return dict_diff({}, want_ace) + for h_a in have_ace: + d = dict_diff(want_ace, h_a) + if not d: + break + return d diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_address_family/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_address_family/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_address_family/bgp_address_family.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_address_family/bgp_address_family.py new file mode 100644 index 000000000..021074805 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_address_family/bgp_address_family.py @@ -0,0 +1,293 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_bgp_address_family config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +import re + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.bgp_address_family import ( + Bgp_afTemplate, +) + + +class Bgp_af(ResourceModule): + """ + The eos_bgp_address_family config class + """ + + def __init__(self, module): + super(Bgp_af, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="bgp_address_family", + tmplt=Bgp_afTemplate(), + ) + self.parsers = [ + "router", + "address_family", + "bgp_params_additional_paths", + "bgp_params.nexthop_address_family", + "bgp_params.nexthop_unchanged", + "bgp_params.redistribute_internal", + "bgp_params.route", + "graceful_restart", + "neighbor.activate", + "neighbor.additional_paths", + "neighbor.default_originate", + "neighbor.graceful_restart", + "neighbor.next_hop_unchanged", + "neighbor.next_hop_address_family", + "neighbor.prefix_list", + "neighbor.route_map", + "neighbor.weight", + "neighbor.encapsulation", + "network", + "redistribute", + "route_target", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + wantd = {} + haved = {} + + if self.want: + wantd = {self.want["as_number"]: self.want} + if self.have: + haved = {self.have["as_number"]: self.have} + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._bgp_af_list_to_dict(entry) + + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + if len(wantd.keys()) > 1: + self._module.fail_json( + msg="Only one bgp instance is allowed per device", + ) + wantd = {} + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + h_del = {} + for k, v in iteritems(haved): + if k in wantd or not wantd: + h_del.update({k: v}) + haved = h_del + for wk, wv in iteritems(wantd): + self._compare(want=wv, have=haved.pop(wk, {})) + + wantd = {} + + # remove superfluous config for overridden + if self.state == "overridden": + for k, have in iteritems(haved): + if k not in wantd: + self._compare(want={}, have=have) + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _delete_af(self, want, have): + waf = want.get("address_family", {}) + haf = have.get("address_family", {}) + for hkey, entry in iteritems(haf): + if hkey in waf.keys(): + af_no_command = self._tmplt.render( + entry, + "address_family", + True, + ).split("\n") + if re.search(r"\S+_\S+", hkey): + af_no_command[0] = af_no_command[0][3:] + af_no_command[1] = "no " + af_no_command[1] + for cmd in af_no_command: + self.commands.append(cmd) + else: + self.addcmd(entry, "address_family", True) + have = {} + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Bgp_af network resource. + """ + for name, entry in iteritems(want): + if name != "as_number": + if self.state == "deleted": + self._delete_af(want, have) + else: + self._compare_af({name: entry}, {name: have.get(name, {})}) + + if self.commands and "router bgp" not in self.commands[0]: + self.commands.insert( + 0, + self._tmplt.render( + {"as_number": want.get("as_number") or have["as_number"]}, + "router", + False, + ), + ) + + def _compare_af(self, want, have): + waf = want.get("address_family", {}) + haf = have.get("address_family", {}) + for name, entry in iteritems(waf): + begin = len(self.commands) + self._compare_lists(entry, have=haf.get(name, {})) + self._compare_neighbor(entry, have=haf.get(name, {})) + # Removing the alias key + if "route_target" in entry.keys(): + entry["route_target"].pop("mode", "") + self.compare( + parsers=self.parsers, + want=entry, + have=haf.pop(name, {}), + ) + if len(self.commands) != begin: + af_command = self._tmplt.render( + entry, + "address_family", + False, + ).split("\n") + for cmd in af_command: + self.commands.insert(begin, cmd) + self.commands.append("exit") + begin += 1 + for name, entry in iteritems(haf): + # skip superfluous configs for replaced + if self.state in ["replaced"]: + if name in waf.keys(): + self.addcmd(entry, "address_family", True) + else: + # overridden + # check if want has vrf or not + # if want doesnot have vrf, device's vrf config will not + # be touched. + vrf_present = False + for w_key in waf.keys(): + if re.search(r"\S+_\S+", w_key): + vrf_present = True + break + if vrf_present: + if re.search(r"\S+_\S+", name): + af_no_command = self._tmplt.render( + entry, + "address_family", + True, + ).split("\n") + if name not in waf.keys(): + af_no_command[0] = af_no_command[0][3:] + af_no_command[1] = "no " + af_no_command[1] + for cmd in af_no_command: + self.commands.append(cmd) + else: + self.addcmd(entry, "address_family", True) + else: + if not re.search(r"\S+_\S+", name): + self.addcmd(entry, "address_family", True) + + def _compare_neighbor(self, want, have): + parsers = [ + "neighbor.activate", + "neighbor.additional_paths", + "neighbor.default_originate", + "neighbor.graceful_restart", + "neighbor.next_hop_unchanged", + "neighbor.next_hop_address_family", + "neighbor.prefix_list", + "neighbor.route_map", + "neighbor.weight", + "neighbor.encapsulation", + ] + wneigh = want.get("neighbor", {}) + hneigh = have.get("neighbor", {}) + for name, entry in iteritems(wneigh): + self.compare( + parsers=parsers, + want={"neighbor": entry}, + have={"neighbor": hneigh.pop(name, {})}, + ) + for name, entry in iteritems(hneigh): + self.compare(parsers=parsers, want={}, have={"neighbor": entry}) + + def _compare_lists(self, want, have): + for attrib in ["redistribute", "network"]: + wdict = want.pop(attrib, {}) + hdict = have.pop(attrib, {}) + for key, entry in iteritems(wdict): + if entry != hdict.pop(key, {}): + self.addcmd(entry, attrib, False) + # remove remaining items in have for replaced + for entry in hdict.values(): + self.addcmd(entry, attrib, True) + + def _bgp_af_list_to_dict(self, entry): + for name, proc in iteritems(entry): + if "address_family" in proc: + addr_dict = {} + for entry in proc.get("address_family", []): + addr_dict.update( + {entry["afi"] + "_" + entry.get("vrf", ""): entry}, + ) + proc["address_family"] = addr_dict + self._bgp_af_list_to_dict(proc["address_family"]) + + if "neighbor" in proc: + neigh_dict = {} + for entry in proc.get("neighbor", []): + neigh_dict.update({entry["peer"]: entry}) + proc["neighbor"] = neigh_dict + + if "network" in proc: + network_dict = {} + for entry in proc.get("network", []): + network_dict.update({entry["address"]: entry}) + proc["network"] = network_dict + + if "redistribute" in proc: + redis_dict = {} + for entry in proc.get("redistribute", []): + redis_dict.update({entry["protocol"]: entry}) + proc["redistribute"] = redis_dict diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_global/bgp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_global/bgp_global.py new file mode 100644 index 000000000..4658ced75 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/bgp_global/bgp_global.py @@ -0,0 +1,422 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_bgp_global config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.bgp_global import ( + Bgp_globalTemplate, +) + + +class Bgp_global(ResourceModule): + """ + The eos_bgp_global config class + """ + + def __init__(self, module): + super(Bgp_global, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="bgp_global", + tmplt=Bgp_globalTemplate(), + ) + self.parsers = [ + "router", + "vrf", + "default_metric", + "distance", + "graceful_restart", + "graceful_restart_helper", + "maximum_paths", + "monitoring", + "route_target", + "router_id", + "shutdown", + "timers", + "ucmp_fec", + "ucmp_link_bandwidth", + "ucmp_mode", + "update", + "vlan", + "vlan_aware_bundle", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + wantd = {} + haved = {} + if ( + self.want.get("as_number") == self.have.get("as_number") + or not self.have + ): + if self.want: + wantd = {self.want["as_number"]: self.want} + if self.have: + haved = {self.have["as_number"]: self.have} + else: + self._module.fail_json( + msg="Only one bgp instance is allowed per device", + ) + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._bgp_global_list_to_dict(entry) + + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state in ["deleted", "purged"]: + h_del = {} + for k, v in iteritems(haved): + if k in wantd or not wantd: + h_del.update({k: v}) + wantd = {} + haved = h_del + + if self.state == "deleted": + self._compare(want={}, have=self.have) + + if self.state == "purged": + for num, entry in iteritems(haved): + self.commands.append( + self._tmplt.render({"as_number": num}, "router", True), + ) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Bgp_global network resource. + """ + self._compare_vrfs(want, have) + self._compare_neighbor(want, have) + self._compare_lists(want, have) + self._compare_bgp_params(want, have) + for name, entry in iteritems(want): + if name != "as_number": + self.compare( + parsers=self.parsers, + want={name: entry}, + have={name: have.pop(name, {})}, + ) + for name, entry in iteritems(have): + if name != "as_number": + self.compare( + parsers=self.parsers, + want={}, + have={name: have.get(name)}, + ) + + if self.commands and "router bgp" not in self.commands[0]: + self.commands.insert( + 0, + self._tmplt.render(want or have, "router", False), + ) + + def _compare_bgp_params(self, want, have): + parsers = [ + "bgp_params_additional_paths", + "bgp_params_advertise_inactive", + "bgp_params_allowas_in", + "bgp_params_always_compare_med", + "bgp_params_asn", + "bgp_params_auto_local_addr", + "bgp_params_bestpath_as_path", + "bgp_params_bestpath_ecmp_fast", + "bgp_params_bestpath_med", + "bgp_params_bestpath_skip", + "bgp_params_tie_break", + "bgp_params_client_to_client", + "bgp_params_cluster_id", + "bgp_params_confederation", + "bgp_params_control_plane_filter", + "bgp_params_convergence", + "bgp_params_default", + "bgp_params.enforce_first_as", + "bgp_params.host_routes", + "bgp_params.labelled_unicast", + "bgp_params.listen_limit", + "bgp_params.listen_range", + "bgp_params.log_neighbor_changes", + "bgp_params.missing_policy", + "bgp_params.monitoring", + "bgp_params.nexthop_unchanged", + "bgp_params.redistribute_internal", + "bgp_params.route", + "bgp_params.route_reflector", + "bgp_params.transport", + ] + wbgp = want.pop("bgp_params", {}) + hbgp = have.pop("bgp_params", {}) + for name, entry in iteritems(wbgp): + if name == "bestpath": + for k, v in iteritems(entry): + h = {} + if hbgp.get(name): + h = {name: hbgp[name].pop(v, {})} + self.compare( + parsers=parsers, + want={"bgp_params": {name: {k: v}}}, + have={"bgp_params": h}, + ) + hbgp.pop(name, {}) + continue + self.compare( + parsers=parsers, + want={"bgp_params": {name: entry}}, + have={"bgp_params": {name: hbgp.pop(name, {})}}, + ) + for name, entry in iteritems(hbgp): + self.compare( + parsers=parsers, + want={}, + have={"bgp_params": {name: entry}}, + ) + + def _compare_vrfs(self, want, have): + wvrf = want.pop("vrfs", {}) + hvrf = have.pop("vrfs", {}) + begin = len(self.commands) + for name, entry in iteritems(wvrf): + self._compare_neighbor(entry, hvrf.get(name, {})) + self._compare_lists(entry, hvrf.get(name, {})) + self._compare_bgp_params(entry, hvrf.get(name, {})) + for k, v in entry.items(): + if hvrf.get(name): + h = {k: hvrf[name].pop(k, {})} + else: + h = {} + if k != "vrf": + self.compare(parsers=self.parsers, want={k: v}, have=h) + + if len(self.commands) != begin: + self.commands.insert( + begin, + self._tmplt.render({"vrf": name}, "vrf", False), + ) + self.commands.append("exit") + begin_negate = len(self.commands) + for name, entry in iteritems(hvrf): + if name not in wvrf.keys(): + if self._check_af(name): + self._module.fail_json( + msg="Use the _bgp_address_family module to delete the address_family under vrf, before replacing/deleting the vrf.", + ) + else: + self.commands.append( + self._tmplt.render({"vrf": name}, "vrf", True), + ) + continue + self.compare(parsers=self.parsers, want={}, have=entry) + after_negate = len(self.commands) + if after_negate != begin_negate: + if "vrf " + name in self.commands: + index = self.commands.index("vrf " + name) + i = begin_negate + while i < after_negate: + cmd = self.commands.pop(i) + if cmd != "exit": + self.commands.insert(index + 1, cmd) + i += 1 + else: + self.commands.insert( + begin_negate, + self._tmplt.render({"vrf": name}, "vrf", False), + ) + self.commands.append("exit") + + def _get_config(self, connection): + return connection.get("show running-config | section bgp ") + + def _check_af(self, vrf): + af_present = False + if self._connection: + config_lines = self._get_config(self._connection).splitlines() + index = [i + 1 for i, el in enumerate(config_lines) if vrf in el] + if index: + # had to do this to escape flake8 and black errors + ind = index[0] + for line in config_lines[ind:]: + if "vrf" in line: + break + if "address-family" in line: + af_present = True + break + return af_present + + def _compare_neighbor(self, want, have): + parsers = [ + "neighbor.additional_paths", + "neighbor.allowas_in", + "neighbor.auto_local_addr", + "neighbor.bfd", + "neighbor.default_originate", + "neighbor.description", + "neighbor.dont_capability_negotiate", + "neighbor.ebgp_multihop", + "neighbor.encryption_password", + "neighbor.enforce_first_as", + "neighbor.export_localpref", + "neighbor.fall_over", + "neighbor.graceful_restart", + "neighbor.graceful_restart_helper", + "neighbor.idle_restart_timer", + "neighbor.import_localpref", + "neighbor.link_bandwidth", + "neighbor.local_as", + "neighbor.local_v6_addr", + "neighbor.maximum_accepted_routes", + "neighbor.maximum_received_routes", + "neighbor.metric_out", + "neighbor.monitoring", + "neighbor.next_hop_self", + "neighbor.next_hop_unchanged", + "neighbor.next_hop_v6_addr", + "neighbor.out_delay", + "neighbor.remote_as", + "neighbor.remove_private_as", + "neighbor.peer_group", + "neighbor.prefix_list", + "neighbor.route_map", + "neighbor.route_reflector_client", + "neighbor.route_to_peer", + "neighbor.send_community", + "neighbor.shutdown", + "neighbor.soft_reconfiguration", + "neighbor.transport", + "neighbor.timers", + "neighbor.ttl", + "neighbor.update_source", + "neighbor.weight", + ] + wneigh = want.pop("neighbor", {}) + hneigh = have.pop("neighbor", {}) + for name, entry in iteritems(wneigh): + for k, v in entry.items(): + if entry.get("peer"): + peer = entry["peer"] + else: + peer = entry["neighbor_address"] + if hneigh.get(name): + h = {"neighbor_address": peer, k: hneigh[name].pop(k, {})} + else: + h = {} + self.compare( + parsers=parsers, + want={"neighbor": {"neighbor_address": peer, k: v}}, + have={"neighbor": h}, + ) + for name, entry in iteritems(hneigh): + if name not in wneigh.keys() and "peer_group" not in entry.keys(): + self.commands.append("no neighbor " + name) + continue + for k, v in entry.items(): + self.compare( + parsers=parsers, + want={}, + have={"neighbor": {"neighbor_address": name, k: v}}, + ) + + def _compare_lists(self, want, have): + for attrib in [ + "redistribute", + "network", + "aggregate_address", + "access_group", + ]: + wdict = want.pop(attrib, {}) + hdict = have.pop(attrib, {}) + for key, entry in iteritems(wdict): + if entry != hdict.pop(key, {}): + self.addcmd(entry, attrib, False) + # remove remaining items in have for replaced + for entry in hdict.values(): + self.addcmd(entry, attrib, True) + + def _bgp_global_list_to_dict(self, entry): + for name, proc in iteritems(entry): + if "neighbor" in proc: + neigh_dict = {} + for entry in proc.get("neighbor", []): + if entry.get("peer"): + peer = entry["peer"] + else: + peer = entry["neighbor_address"] + neigh_dict.update({peer: entry}) + proc["neighbor"] = neigh_dict + + if "network" in proc: + network_dict = {} + for entry in proc.get("network", []): + network_dict.update({entry["address"]: entry}) + proc["network"] = network_dict + + if "aggregate_address" in proc: + agg_dict = {} + for entry in proc.get("aggregate_address", []): + agg_dict.update({entry["address"]: entry}) + proc["aggregate_address"] = agg_dict + + if "access_group" in proc: + access_dict = {} + for entry in proc.get("access_group", []): + access_dict.update({entry["afi"]: entry}) + proc["access_group"] = access_dict + + if "redistribute" in proc: + redis_dict = {} + for entry in proc.get("redistribute", []): + redis_dict.update({entry["protocol"]: entry}) + proc["redistribute"] = redis_dict + + if "vrfs" in proc: + vrf_dict = {} + for entry in proc.get("vrfs", []): + vrf_dict.update({entry["vrf"]: entry}) + proc["vrfs"] = vrf_dict + self._bgp_global_list_to_dict(proc["vrfs"]) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/hostname/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/hostname/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/hostname/hostname.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/hostname/hostname.py new file mode 100644 index 000000000..026e1ae19 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/hostname/hostname.py @@ -0,0 +1,76 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2022 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_hostname config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.hostname import ( + HostnameTemplate, +) + + +class Hostname(ResourceModule): + """ + The eos_hostname config class + """ + + def __init__(self, module): + super(Hostname, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="hostname", + tmplt=HostnameTemplate(), + ) + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + wantd = self.want + haved = self.have + + if self.state == "deleted": + wantd = {} + + self._compare(want=wantd, have=haved) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Hostname network resource. + """ + self.compare(parsers="hostname", want=want, have=have) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/interfaces/interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/interfaces/interfaces.py new file mode 100644 index 000000000..fdaa9e979 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/interfaces/interfaces.py @@ -0,0 +1,309 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_interfaces class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + param_list_to_dict, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.utils.utils import ( + normalize_interface, +) + + +class Interfaces(ConfigBase): + """ + The eos_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["interfaces"] + + def get_interfaces_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + interfaces_facts = facts["ansible_network_resources"].get("interfaces") + if not interfaces_facts: + return [] + return interfaces_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = list() + warnings = list() + + if self.state in self.ACTION_STATES: + existing_interfaces_facts = self.get_interfaces_facts() + else: + existing_interfaces_facts = [] + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_interfaces_facts = self.get_interfaces_facts() + + elif self.state == "rendered": + result["rendered"] = commands + + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_interfaces_facts(data=running_config) + + if self.state in self.ACTION_STATES: + result["before"] = existing_interfaces_facts + if result["changed"]: + result["after"] = changed_interfaces_facts + + elif self.state == "gathered": + result["gathered"] = changed_interfaces_facts + result["warnings"] = warnings + return result + + def set_config(self, existing_interfaces_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_interfaces_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + want = param_list_to_dict(want) + have = param_list_to_dict(have) + commands = [] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + if ( + "speed" in add_config.keys() + and "duplex" not in add_config.keys() + ): + add_config.update({"duplex": desired.get("duplex")}) + + commands.extend(generate_commands(key, add_config, del_config)) + + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, extant in have.items(): + if key in want: + desired = want[key] + else: + desired = dict() + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + if ( + "speed" in add_config.keys() + and "duplex" not in add_config.keys() + ): + add_config.update({"duplex": desired.get("duplex")}) + + commands.extend(generate_commands(key, add_config, del_config)) + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + + add_config = dict_diff(extant, desired) + if ( + "speed" in add_config.keys() + and "duplex" not in add_config.keys() + ): + add_config.update({"duplex": desired.get("duplex")}) + commands.extend(generate_commands(key, add_config, {})) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + for key in want: + desired = dict() + if key in have: + extant = have[key] + else: + continue + + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(key, {}, del_config)) + + return commands + + +def generate_commands(interface, to_set, to_remove): + commands = [] + for key, value in to_set.items(): + if value is None: + continue + + if key == "enabled": + commands.append("{0}shutdown".format("no " if value else "")) + elif key == "speed": + if value == "auto": + commands.append("{0} {1}".format(key, value)) + else: + commands.append("speed {0}{1}".format(value, to_set["duplex"])) + elif key == "duplex": + # duplex is handled with speed + continue + elif key == "mode": + if not re.search(r"(M|m)anagement.*", interface): + if value == "layer3": + # switching from default (layer2) mode to layer3 + commands.append("no switchport") + else: + # setting to default (layer 2) mode + commands.append("switchport") + else: + commands.append("{0} {1}".format(key, value)) + + # Don't try to also remove the same key, if present in to_remove + to_remove.pop(key, None) + + for key in to_remove.keys(): + if key == "enabled": + commands.append("no shutdown") + elif key == "speed": + commands.append("speed auto") + elif key == "duplex": + # duplex is handled with speed + continue + elif key == "mode": + if not re.search(r"(M|m)anagement.*", interface): + commands.append("switchport") + else: + commands.append("no {0}".format(key)) + + if commands: + commands.insert(0, "interface {0}".format(interface)) + + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l2_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l2_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l2_interfaces/l2_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l2_interfaces/l2_interfaces.py new file mode 100644 index 000000000..a34c1614a --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l2_interfaces/l2_interfaces.py @@ -0,0 +1,365 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_l2_interfaces class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + param_list_to_dict, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.utils.utils import ( + normalize_interface, + vlan_range_to_list, +) + + +class L2_interfaces(ConfigBase): + """ + The eos_l2_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["l2_interfaces"] + + def get_l2_interfaces_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + l2_interfaces_facts = facts["ansible_network_resources"].get( + "l2_interfaces", + ) + if not l2_interfaces_facts: + return [] + return l2_interfaces_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = list() + warnings = list() + + if self.state in self.ACTION_STATES: + existing_l2_interfaces_facts = self.get_l2_interfaces_facts() + else: + existing_l2_interfaces_facts = [] + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_l2_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_l2_interfaces_facts = self.get_l2_interfaces_facts() + + elif self.state == "rendered": + result["rendered"] = commands + + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_l2_interfaces_facts( + data=running_config, + ) + + if self.state in self.ACTION_STATES: + result["before"] = existing_l2_interfaces_facts + if result["changed"]: + result["after"] = changed_l2_interfaces_facts + + elif self.state == "gathered": + result["gathered"] = changed_l2_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_l2_interfaces_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_l2_interfaces_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + want = param_list_to_dict(want) + have = param_list_to_dict(have) + commands = [] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + + intf_commands = set_interface(desired, extant) + intf_commands.extend(clear_interface(desired, extant)) + + if intf_commands: + commands.append("interface {0}".format(interface_name)) + commands.extend(intf_commands) + + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, extant in have.items(): + if key in want: + desired = want[key] + else: + desired = dict() + + intf_commands = set_interface(desired, extant) + intf_commands.extend(clear_interface(desired, extant)) + + if intf_commands: + commands.append("interface {0}".format(key)) + commands.extend(intf_commands) + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + + intf_commands = set_interface(desired, extant) + + if intf_commands: + commands.append("interface {0}".format(interface_name)) + commands.extend(intf_commands) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + for key in want: + desired = dict() + if key in have: + extant = have[key] + else: + continue + intf_commands = clear_interface(desired, extant) + + if intf_commands: + commands.append("interface {0}".format(key)) + commands.extend(intf_commands) + + return commands + + +def set_interface(want, have): + commands = [] + + want_mode = want.get("mode") + if want_mode and want_mode != have.get("mode"): + commands.append("switchport mode {0}".format(want_mode)) + + wants_access = want.get("access") + if wants_access: + access_vlan = wants_access.get("vlan") + if access_vlan and access_vlan != have.get("access", {}).get("vlan"): + commands.append("switchport access vlan {0}".format(access_vlan)) + + wants_trunk = want.get("trunk") + if wants_trunk: + allowed_vlans = [] + has_allowed_vlans = {} + want_allowed_vlans = {} + has_trunk = have.get("trunk", {}) + native_vlan = wants_trunk.get("native_vlan") + if native_vlan and native_vlan != has_trunk.get("native_vlan"): + commands.append( + "switchport trunk native vlan {0}".format(native_vlan), + ) + for con in [want, have]: + expand_trunk_allowed_vlans(con) + want_allowed_vlans = want["trunk"].get("trunk_allowed_vlans") + if has_trunk: + has_allowed_vlans = has_trunk.get("trunk_allowed_vlans") + + if want_allowed_vlans and has_allowed_vlans: + allowed_vlans = list( + set(want_allowed_vlans.split(",")) + - set(has_allowed_vlans.split(",")), + ) + elif want_allowed_vlans: + allowed_vlans = want_allowed_vlans.split(",") + if allowed_vlans: + allowed_vlans.sort() + allowed_vlans = ",".join( + ["{0}".format(vlan) for vlan in allowed_vlans], + ) + if has_allowed_vlans: + commands.append( + "switchport trunk allowed vlan add {0}".format( + allowed_vlans, + ), + ) + else: + commands.append( + "switchport trunk allowed vlan {0}".format(allowed_vlans), + ) + return commands + + +def expand_trunk_allowed_vlans(want): + if not want: + return None + if want.get("trunk"): + if "trunk_allowed_vlans" in want["trunk"]: + allowed_vlans = vlan_range_to_list( + want["trunk"]["trunk_allowed_vlans"], + ) + vlans_list = [str(num) for num in sorted(allowed_vlans)] + want["trunk"]["trunk_allowed_vlans"] = ",".join(vlans_list) + + +def clear_interface(want, have): + commands = [] + + if "mode" in have and want.get("mode") is None: + commands.append("no switchport mode") + + if "access" in have and not want.get("access"): + commands.append("no switchport access vlan") + + has_trunk = have.get("trunk") or {} + wants_trunk = want.get("trunk") or {} + if ( + "trunk_allowed_vlans" in has_trunk + and "trunk_allowed_vlans" not in wants_trunk + ): + commands.append("no switchport trunk allowed vlan") + if ( + "trunk_allowed_vlans" in has_trunk + and "trunk_allowed_vlans" in wants_trunk + ): + for con in [want, have]: + expand_trunk_allowed_vlans(con) + want_allowed_vlans = want["trunk"].get("trunk_allowed_vlans") + has_allowed_vlans = has_trunk.get("trunk_allowed_vlans") + allowed_vlans = list( + set(has_allowed_vlans.split(",")) + - set(want_allowed_vlans.split(",")), + ) + if allowed_vlans: + allowed_vlans = ",".join( + ["{0}".format(vlan) for vlan in allowed_vlans], + ) + + commands.append( + "switchport trunk allowed vlan remove {0}".format( + allowed_vlans, + ), + ) + + if "native_vlan" in has_trunk and "native_vlan" not in wants_trunk: + commands.append("no switchport trunk native vlan") + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l3_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l3_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l3_interfaces/l3_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l3_interfaces/l3_interfaces.py new file mode 100644 index 000000000..a34e23619 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/l3_interfaces/l3_interfaces.py @@ -0,0 +1,351 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_l3_interfaces class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + param_list_to_dict, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.utils.utils import ( + normalize_interface, +) + + +class L3_interfaces(ConfigBase): + """ + The eos_l3_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["l3_interfaces"] + + def get_l3_interfaces_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + l3_interfaces_facts = facts["ansible_network_resources"].get( + "l3_interfaces", + ) + if not l3_interfaces_facts: + return [] + return l3_interfaces_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = list() + warnings = list() + + if self.state in self.ACTION_STATES: + existing_l3_interfaces_facts = self.get_l3_interfaces_facts() + else: + existing_l3_interfaces_facts = [] + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_l3_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_l3_interfaces_facts = self.get_l3_interfaces_facts() + + elif self.state == "rendered": + result["rendered"] = commands + + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_l3_interfaces_facts( + data=running_config, + ) + + if self.state in self.ACTION_STATES: + result["before"] = existing_l3_interfaces_facts + if result["changed"]: + result["after"] = changed_l3_interfaces_facts + + elif self.state == "gathered": + result["gathered"] = changed_l3_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_l3_interfaces_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_l3_interfaces_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + want = param_list_to_dict(want) + have = param_list_to_dict(have) + commands = [] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + intf_commands = set_interface(desired, extant) + intf_commands.extend(clear_interface(desired, extant)) + + if intf_commands: + commands.append("interface {0}".format(interface_name)) + commands.extend(intf_commands) + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, extant in have.items(): + interface_name = normalize_interface(key) + desired = dict() + if "Management" in interface_name: + continue + for k in want.keys(): + k_want = normalize_interface(k) + if key == k_want: + desired = want[k] + break + if desired.get("ipv4"): + for ipv4 in desired["ipv4"]: + for k in ["secondary", "virtual"]: + if ipv4[k] is None: + del ipv4[k] + intf_commands = set_interface(desired, extant) + intf_commands.extend(clear_interface(desired, extant)) + + if intf_commands: + commands.append("interface {0}".format(interface_name)) + commands.extend(intf_commands) + + # new interfaces in want + new_intf_commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name not in have: + extant = dict() + new_intf_commands = set_interface(desired, extant) + + if new_intf_commands: + commands.append("interface {0}".format(interface_name)) + commands.extend(new_intf_commands) + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + + intf_commands = set_interface(desired, extant) + if intf_commands: + commands.append("interface {0}".format(interface_name)) + commands.extend(intf_commands) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + for key in want: + interface_name = normalize_interface(key) + desired = dict() + if interface_name in have: + extant = have[interface_name] + else: + continue + + intf_commands = clear_interface(desired, extant) + + if intf_commands: + commands.append("interface {0}".format(interface_name)) + commands.extend(intf_commands) + + return commands + + +def set_interface(want, have): + commands = [] + want_ipv4 = set( + tuple(sorted(address.items())) for address in want.get("ipv4") or [] + ) + have_ipv4 = set( + tuple(sorted(address.items())) for address in have.get("ipv4") or [] + ) + for address in want_ipv4 - have_ipv4: + address = dict(address) + for param in ["secondary", "virtual"]: + if param in address and not address[param]: + del address[param] + if tuple(sorted(address.items())) in have_ipv4: + continue + + address_cmd = "ip address {0}".format(address["address"]) + if address.get("secondary"): + address_cmd += " secondary" + if address.get("virtual"): + address_cmd = "ip address virtual {0}".format(address["address"]) + commands.append(address_cmd) + + want_ipv6 = set( + tuple(sorted(address.items())) for address in want.get("ipv6") or [] + ) + have_ipv6 = set( + tuple(sorted(address.items())) for address in have.get("ipv6") or [] + ) + for address in want_ipv6 - have_ipv6: + address = dict(address) + commands.append("ipv6 address {0}".format(address["address"])) + return commands + + +def clear_interface(want, have): + commands = [] + want_ipv4 = set( + tuple(sorted(address.items())) for address in want.get("ipv4") or [] + ) + have_ipv4 = set( + tuple(sorted(address.items())) for address in have.get("ipv4") or [] + ) + if not want_ipv4 and have_ipv4: + commands.append("no ip address") + else: + for address in have_ipv4 - want_ipv4: + address = dict(address) + for param in ["secondary", "virtual"]: + if param not in address: + address[param] = None + if tuple(sorted(address.items())) in want_ipv4: + continue + + if address.get("secondary"): + commands.append( + "no ip address {0} secondary".format(address["address"]), + ) + if address.get("virtual"): + commands.append( + "no ip address virtual {0}".format(address["address"]), + ) + + if "secondary" not in address: + # Removing non-secondary removes all other interfaces + break + + want_ipv6 = set( + tuple(sorted(address.items())) for address in want.get("ipv6") or [] + ) + have_ipv6 = set( + tuple(sorted(address.items())) for address in have.get("ipv6") or [] + ) + for address in have_ipv6 - want_ipv6: + address = dict(address) + commands.append("no ipv6 address {0}".format(address["address"])) + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp/lacp.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp/lacp.py new file mode 100644 index 000000000..0d7ba850f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp/lacp.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_lacp class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) + + +class Lacp(ConfigBase): + """ + The eos_lacp class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lacp"] + + def get_lacp_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + lacp_facts = facts["ansible_network_resources"].get("lacp") + if not lacp_facts: + return {} + return lacp_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + + if self.state in self.ACTION_STATES: + existing_lacp_facts = self.get_lacp_facts() + else: + existing_lacp_facts = {} + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_lacp_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_lacp_facts = self.get_lacp_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_lacp_facts(data=running_config) + + if self.state in self.ACTION_STATES: + result["before"] = existing_lacp_facts + if result["changed"]: + result["after"] = changed_lacp_facts + + elif self.state == "gathered": + result["gathered"] = changed_lacp_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_lacp_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] or {} + have = existing_lacp_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if state in ("merged", "replaced", "rendered") and not want: + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + if state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + to_set = dict_diff(have, want) + if "system" in to_set: + system = to_set["system"] + if "priority" in system: + commands.append( + "lacp system-priority {0}".format(system["priority"]), + ) + + to_del = dict_diff(want, have) + if "system" in to_del: + system = to_del["system"] + system_set = to_set.get("system", {}) + if "priority" in system and "priority" not in system_set: + commands.append("no lacp system-priority") + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + to_set = dict_diff(have, want) + if "system" in to_set: + system = to_set["system"] + if "priority" in system: + commands.append( + "lacp system-priority {0}".format(system["priority"]), + ) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + to_del = dict_diff(want, have) + if "system" in to_del: + system = to_del["system"] + if "priority" in system: + commands.append("no lacp system-priority") + + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp_interfaces/lacp_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp_interfaces/lacp_interfaces.py new file mode 100644 index 000000000..64746f880 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lacp_interfaces/lacp_interfaces.py @@ -0,0 +1,262 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_lacp_interfaces class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + param_list_to_dict, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.utils.utils import ( + normalize_interface, +) + + +class Lacp_interfaces(ConfigBase): + """ + The eos_lacp_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lacp_interfaces"] + + def get_lacp_interfaces_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + lacp_interfaces_facts = facts["ansible_network_resources"].get( + "lacp_interfaces", + ) + if not lacp_interfaces_facts: + return [] + return lacp_interfaces_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + + if self.state in self.ACTION_STATES: + existing_lacp_interfaces_facts = self.get_lacp_interfaces_facts() + else: + existing_lacp_interfaces_facts = {} + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_lacp_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_lacp_interfaces_facts = self.get_lacp_interfaces_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_lacp_interfaces_facts( + data=running_config, + ) + if self.state in self.ACTION_STATES: + result["before"] = existing_lacp_interfaces_facts + if result["changed"]: + result["after"] = changed_lacp_interfaces_facts + elif self.state == "gathered": + result["gathered"] = changed_lacp_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_lacp_interfaces_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_lacp_interfaces_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + want = param_list_to_dict(want) + have = param_list_to_dict(have) + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(key, add_config, del_config)) + + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, extant in have.items(): + if key in want: + desired = want[key] + else: + desired = dict() + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(key, add_config, del_config)) + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict() + + add_config = dict_diff(extant, desired) + + commands.extend(generate_commands(key, add_config, {})) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + for key in want: + desired = dict() + if key in have: + extant = have[key] + else: + continue + + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(key, {}, del_config)) + + return commands + + +def generate_commands(interface, to_set, to_remove): + commands = [] + for key in to_remove.keys(): + if key == "rate": + continue + commands.append("no lacp {0}".format(key.replace("_", "-"))) + + for key, value in to_set.items(): + if key == "rate": + continue + if value is None: + continue + + commands.append("lacp {0} {1}".format(key.replace("_", "-"), value)) + + if commands: + commands.insert(0, "interface {0}".format(interface)) + + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lag_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lag_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lag_interfaces/lag_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lag_interfaces/lag_interfaces.py new file mode 100644 index 000000000..b69ae175f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lag_interfaces/lag_interfaces.py @@ -0,0 +1,275 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_lag_interfaces class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + +import re + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.utils.utils import ( + normalize_interface, +) + + +class Lag_interfaces(ConfigBase): + """ + The eos_lag_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lag_interfaces"] + + def get_lag_interfaces_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + lag_interfaces_facts = facts["ansible_network_resources"].get( + "lag_interfaces", + ) + if not lag_interfaces_facts: + return [] + return lag_interfaces_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + commands = list() + warnings = list() + + if self.state in self.ACTION_STATES: + existing_lag_interfaces_facts = self.get_lag_interfaces_facts() + else: + existing_lag_interfaces_facts = {} + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_lag_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_lag_interfaces_facts = self.get_lag_interfaces_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_lag_interfaces_facts( + data=running_config, + ) + + if self.state in self.ACTION_STATES: + result["before"] = existing_lag_interfaces_facts + if result["changed"]: + result["after"] = changed_lag_interfaces_facts + elif self.state == "gathered": + result["gathered"] = changed_lag_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_lag_interfaces_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_lag_interfaces_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for interface in want: + interface_name = normalize_interface(interface["name"]) + for extant in have: + if extant["name"] == interface_name: + break + else: + extant = dict(name=interface_name) + + commands.extend(set_config(interface, extant)) + commands.extend(remove_config(interface, extant)) + + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for extant in have: + for interface in want: + if normalize_interface(interface["name"]) == extant["name"]: + break + else: + interface = dict(name=extant["name"]) + commands.extend(remove_config(interface, extant)) + + for interface in want: + interface_name = normalize_interface(interface["name"]) + for extant in have: + if extant["name"] == interface_name: + break + else: + extant = dict(name=interface_name) + commands.extend(set_config(interface, extant)) + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + for interface in want: + interface_name = normalize_interface(interface["name"]) + for extant in have: + if extant["name"] == interface_name: + break + else: + extant = dict(name=interface_name) + + commands.extend(set_config(interface, extant)) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + for interface in want: + interface_name = normalize_interface(interface["name"]) + for extant in have: + if extant["name"] == interface_name: + break + else: + extant = dict(name=interface_name) + + # Clearing all args, send empty dictionary + interface = dict(name=interface_name) + commands.extend(remove_config(interface, extant)) + + return commands + + +def set_config(want, have): + commands = [] + to_set = dict_diff(have, want) + for member in to_set.get("members", []): + channel_id = re.search(r"\d.*", want["name"]) + if channel_id: + commands.extend( + [ + "interface {0}".format(member["member"]), + "channel-group {0} mode {1}".format( + channel_id.group(0), + member["mode"], + ), + ], + ) + + return commands + + +def remove_config(want, have): + commands = [] + if not want.get("members"): + return ["no interface {0}".format(want["name"])] + + to_remove = dict_diff(want, have) + for member in to_remove.get("members", []): + commands.extend( + ["interface {0}".format(member["member"]), "no channel-group"], + ) + + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_global/lldp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_global/lldp_global.py new file mode 100644 index 000000000..f42471ff9 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_global/lldp_global.py @@ -0,0 +1,215 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_lldp_global class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) + + +class Lldp_global(ConfigBase): + """ + The eos_lldp_global class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lldp_global"] + + def __init__(self, module): + super(Lldp_global, self).__init__(module) + + def get_lldp_global_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + lldp_global_facts = facts["ansible_network_resources"].get( + "lldp_global", + ) + if not lldp_global_facts: + return {} + return lldp_global_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + + if self.state in self.ACTION_STATES: + existing_lldp_global_facts = self.get_lldp_global_facts() + else: + existing_lldp_global_facts = {} + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_lldp_global_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_lldp_global_facts = self.get_lldp_global_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_lldp_global_facts(data=running_config) + + if self.state in self.ACTION_STATES: + result["before"] = existing_lldp_global_facts + if result["changed"]: + result["after"] = changed_lldp_global_facts + + elif self.state == "gathered": + result["gathered"] = changed_lldp_global_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_lldp_global_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] or {} + have = existing_lldp_global_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + if state == "deleted": + commands = state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = state_merged(want, have) + elif state == "replaced": + commands = state_replaced(want, have) + return commands + + +def state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = set() + # merged and deleted are likely to emit duplicate tlv-select commands + commands.update(state_merged(want, have)) + commands.update(state_deleted(want, have)) + + return list(commands) + + +def state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + to_set = dict_diff(have, want) + tlv_options = to_set.pop("tlv_select", {}) + for key, value in to_set.items(): + if key == "holdtime": + key = "hold-time" + if key == "reinit": + key = "timer reinitialization" + commands.append("lldp {0} {1}".format(key, value)) + for key, value in tlv_options.items(): + device_option = key.replace("_", "-") + if value is True: + commands.append("lldp tlv transmit {0}".format(device_option)) + elif value is False: + commands.append("no lldp tlv transmit {0}".format(device_option)) + + return commands + + +def state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + to_remove = dict_diff(want, have) + tlv_options = to_remove.pop("tlv_select", {}) + for key in to_remove: + if key == "holdtime": + key = "hold-time" + if key == "reinit": + key = "timer reinitialization" + commands.append("no lldp {0}".format(key)) + for key, value in tlv_options.items(): + device_option = key.replace("_", "-") + if value is False: + commands.append("lldp tlv transmit {0}".format(device_option)) + elif value is True: + commands.append("no lldp tlv transmit {0}".format(device_option)) + + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_interfaces/lldp_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_interfaces/lldp_interfaces.py new file mode 100644 index 000000000..c0325102b --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/lldp_interfaces/lldp_interfaces.py @@ -0,0 +1,264 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_lldp_interfaces class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + param_list_to_dict, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.utils.utils import ( + normalize_interface, +) + + +class Lldp_interfaces(ConfigBase): + """ + The eos_lldp_interfaces class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["lldp_interfaces"] + + def get_lldp_interfaces_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + lldp_interfaces_facts = facts["ansible_network_resources"].get( + "lldp_interfaces", + ) + if not lldp_interfaces_facts: + return [] + return lldp_interfaces_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + + if self.state in self.ACTION_STATES: + existing_lldp_interfaces_facts = self.get_lldp_interfaces_facts() + else: + existing_lldp_interfaces_facts = [] + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_lldp_interfaces_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_lldp_interfaces_facts = self.get_lldp_interfaces_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_lldp_interfaces_facts( + data=running_config, + ) + + if self.state in self.ACTION_STATES: + result["before"] = existing_lldp_interfaces_facts + if result["changed"]: + result["after"] = changed_lldp_interfaces_facts + + elif self.state == "gathered": + result["gathered"] = changed_lldp_interfaces_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_lldp_interfaces_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_lldp_interfaces_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + want = param_list_to_dict(want, remove_key=False) + have = param_list_to_dict(have, remove_key=False) + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict(name=interface_name) + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + commands.extend( + generate_commands(interface_name, add_config, del_config), + ) + + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for key, extant in have.items(): + if key in want: + desired = want[key] + else: + desired = dict(name=key) + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(key, add_config, del_config)) + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + for key, desired in want.items(): + interface_name = normalize_interface(key) + if interface_name in have: + extant = have[interface_name] + else: + extant = dict(name=interface_name) + + add_config = dict_diff(extant, desired) + + commands.extend(generate_commands(interface_name, add_config, {})) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + for key in want.keys(): + interface_name = normalize_interface(key) + desired = dict(name=interface_name) + if interface_name in have: + extant = have[interface_name] + else: + continue + + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(interface_name, {}, del_config)) + + return commands + + +def generate_commands(name, to_set, to_remove): + commands = [] + for key, value in to_set.items(): + if value is None: + continue + + prefix = "" if value else "no " + commands.append("{0}lldp {1}".format(prefix, key)) + + for key in to_remove: + commands.append("lldp {0}".format(key)) + + if commands: + commands.insert(0, "interface {0}".format(name)) + + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/logging_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/logging_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/logging_global/logging_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/logging_global/logging_global.py new file mode 100644 index 000000000..8016b29d7 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/logging_global/logging_global.py @@ -0,0 +1,190 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_logging_global config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.logging_global import ( + Logging_globalTemplate, +) + + +class Logging_global(ResourceModule): + """ + The eos_logging_global config class + """ + + def __init__(self, module): + super(Logging_global, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="logging_global", + tmplt=Logging_globalTemplate(), + ) + self.parsers = [ + "buffered", + "event", + "facility", + "console", + "format", + "format.timestamp.traditional", + "format.timestamp.highresolution", + "level", + "monitor", + "on", + "persistent", + "policy", + "relogging_interval", + "repeat_messages", + "src_interface", + "synchronous", + "trap", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + + wantd = {"logging_global": self.want} + haved = {"logging_global": self.have} + # turn all lists of dicts into dicts prior to merge + for entry in wantd["logging_global"], haved["logging_global"]: + self._logging_global_list_to_dict(entry) + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + wantd = {} + for k, have in iteritems(haved): + self._compare(want={}, have=have) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Logging_global network resource. + """ + self._hosts_compare(want=want, have=have) + self._vrfs_compare(want=want, have=have) + self.compare(parsers=self.parsers, want=want, have=have) + + def _hosts_compare(self, want, have): + host_want = want.pop("hosts", {}) + host_have = have.pop("hosts", {}) + for name, entry in iteritems(host_want): + h = {} + if host_have: + h = {"hosts": host_have.pop(name, {})} + self.compare(parsers="host", want={"hosts": entry}, have=h) + for name, entry in iteritems(host_have): + self.compare(parsers="host", want={}, have={"hosts": entry}) + + def _vrfs_hosts_compare(self, vrf, want, have): + host_want = want.pop("hosts", {}) + host_have = have.pop("hosts", {}) + for name, entry in iteritems(host_want): + h = {} + if host_have: + h = {"vrfs": {"name": vrf, "hosts": host_have.pop(name, {})}} + w = {"vrfs": {"name": vrf, "hosts": entry}} + self.compare(parsers="vrf.host", want=w, have=h) + for name, entry in iteritems(host_have): + self.compare( + parsers="vrf.host", + want={}, + have={"vrfs": {"name": vrf, "hosts": entry}}, + ) + + def _vrfs_compare(self, want, have): + vrf_want = want.pop("vrfs", {}) + vrf_have = have.pop("vrfs", {}) + for name, entry in iteritems(vrf_want): + self._vrfs_hosts_compare( + name, + want=entry, + have=vrf_have.get(name, {}), + ) + if entry.get("source_interface"): + h = {} + if vrf_have.get(name): + h = { + "vrfs": { + "name": name, + "source_interface": vrf_have[name].pop( + "source_interface", + "", + ), + }, + } + w = { + "vrfs": { + "name": name, + "source_interface": entry["source_interface"], + }, + } + self.compare(parsers="vrf.source_interface", want=w, have=h) + for name, entry in iteritems(vrf_have): + self._vrfs_hosts_compare(name, want={}, have=entry) + self.compare( + parsers="vrf.source_interface", + want={}, + have={"vrfs": entry}, + ) + + def _logging_global_list_to_dict(self, entry): + if "hosts" in entry: + hosts_dict = {} + for el in entry["hosts"]: + hosts_dict.update({el["name"]: el}) + entry["hosts"] = hosts_dict + + if "vrfs" in entry: + vrf_dict = {} + for el in entry["vrfs"]: + vrf_dict.update({el["name"]: el}) + entry["vrfs"] = vrf_dict + for k, v in iteritems(entry["vrfs"]): + self._logging_global_list_to_dict(v) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ntp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ntp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ntp_global/ntp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ntp_global/ntp_global.py new file mode 100644 index 000000000..0b8323d15 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ntp_global/ntp_global.py @@ -0,0 +1,249 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_ntp_global config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.ntp_global import ( + Ntp_globalTemplate, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.utils.utils import ( + normalize_interface, +) + + +class Ntp_global(ResourceModule): + """ + The eos_ntp_global config class + """ + + def __init__(self, module): + super(Ntp_global, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="ntp_global", + tmplt=Ntp_globalTemplate(), + ) + self.parsers = [ + "authenticate", + "local_interface", + "qos_dscp", + "trusted_key", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + wantd = {"ntp_global": self.want} + haved = {"ntp_global": self.have} + # turn all lists of dicts into dicts prior to merge + for entry in wantd["ntp_global"], haved["ntp_global"]: + self._ntp_global_list_to_dict(entry) + + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + wantd = {} + for k, have in iteritems(haved): + if k not in wantd: + self._compare(want={}, have=have) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Ntp_global network resource. + """ + self._serve_compare(want=want, have=have) + self._authentication_keys_compare(want=want, have=have) + self._servers_compare(want=want, have=have) + self.compare(parsers=self.parsers, want=want, have=have) + add_cmd = [] + del_cmd = [] + if self.commands: + for cmd in self.commands: + if "no ntp" in cmd: + del_cmd.append(cmd) + else: + add_cmd.append(cmd) + self.commands = del_cmd + add_cmd + + def _authentication_keys_compare(self, want, have): + w = want.pop("authentication_keys", {}) + h = have.pop("authentication_keys", {}) + for name, entry in iteritems(w): + h_key = {} + if h.get(name): + h_key = {"authentication_keys": h.pop(name)} + self.compare( + parsers="authentication_keys", + want={"authentication_keys": entry}, + have=h_key, + ) + for name, entry in iteritems(h): + self.compare( + parsers="authentication_keys", + want={}, + have={"authentication_keys": entry}, + ) + + def _servers_compare(self, want, have): + w = want.pop("servers", {}) + h = have.pop("servers", {}) + for name, entry in iteritems(w): + if entry.get("source"): + entry["source"] = normalize_interface(entry["source"]) + h_key = {} + if h.get(name): + h_key = {"servers": h.pop(name)} + self.compare( + parsers="servers", + want={"servers": entry}, + have=h_key, + ) + for name, entry in iteritems(h): + self.compare(parsers="servers", want={}, have={"servers": entry}) + + def _serve_compare(self, want, have): + serve_want = want.pop("serve", {}) + serve_have = have.pop("serve", {}) + for name, entry in iteritems(serve_want): + if name == "all" and entry: + w = {"serve": {"all": True}} + self.compare( + parsers="serve_all", + want=w, + have={"serve": {"all": serve_have.pop("all", False)}}, + ) + else: + for k_afi, v_afi in iteritems(entry): + for k, v in iteritems(v_afi): + afi = v_afi["afi"] + if k == "afi": + continue + h = {} + if k == "acls": + for ace, ace_entry in iteritems(v): + if serve_have.get("access_lists"): + for hk, hv in iteritems( + serve_have["access_lists"], + ): + for h_k, h_v in iteritems(hv): + h_afi = hv["afi"] + if h_k == "afi": + continue + if h_afi == afi: + if ace in h_v: + h_acc = { + "afi": h_afi, + "acls": h_v.pop(ace), + } + h = { + "serve": { + "access_lists": h_acc, + }, + } + w = { + "serve": { + "access_lists": { + "afi": afi, + "acls": ace_entry, + }, + }, + } + self.compare(parsers="serve", want=w, have=h) + for k, v in iteritems(serve_have): + if k == "all" and v: + h = {"serve": {"all": True}} + self.compare(parsers="serve_all", want={}, have=h) + else: + for k_afi, v_afi in iteritems(v): + for k, v in iteritems(v_afi): + hafi = v_afi["afi"] + if k == "afi": + continue + for k_acl, v_acl in iteritems(v): + h = { + "serve": { + "access_lists": { + "afi": hafi, + "acls": v_acl, + }, + }, + } + self.compare(parsers="serve", want={}, have=h) + + def _ntp_global_list_to_dict(self, entry): + if "authentication_keys" in entry: + key_dict = {} + for el in entry["authentication_keys"]: + key_dict.update({el["id"]: el}) + entry["authentication_keys"] = key_dict + + if "servers" in entry: + server_dict = {} + for el in entry["servers"]: + server_dict.update({el["server"]: el}) + entry["servers"] = server_dict + + if "serve" in entry: + serve_dict = {} + main_dict = {} + if entry["serve"].get("all"): + main_dict.update({"all": entry["serve"]["all"]}) + if entry["serve"].get("access_lists"): + for el in entry["serve"].get("access_lists"): + if "acls" in el: + acl_dict = {} + for acl in el["acls"]: + acl_dict.update({acl["acl_name"]: acl}) + el["acls"] = acl_dict + serve_dict.update({el["afi"]: el}) + if serve_dict: + main_dict.update({"access_lists": serve_dict}) + if serve_dict: + entry["serve"] = main_dict diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospf_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospf_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospf_interfaces/ospf_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospf_interfaces/ospf_interfaces.py new file mode 100644 index 000000000..38d46bd7c --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospf_interfaces/ospf_interfaces.py @@ -0,0 +1,212 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_ospf_interfaces config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.ospf_interfaces import ( + Ospf_interfacesTemplate, +) + + +class Ospf_interfaces(ResourceModule): + """ + The eos_ospf_interfaces config class + """ + + def __init__(self, module): + super(Ospf_interfaces, self).__init__( + empty_fact_val=[], + facts_module=Facts(module), + module=module, + resource="ospf_interfaces", + tmplt=Ospf_interfacesTemplate(), + ) + self.parsers = [ + "interfaces", + "area", + "authentication_v2", + "authentication_v3", + "authentication_key", + "deadinterval", + "encryption", + "hellointerval", + "bfd", + "cost", + "ip_params_area", + "ip_params_bfd", + "ip_params_cost", + "ip_params_dead_interval", + "ip_params_hello_interval", + "ip_params_mtu_ignore", + "ip_params_network", + "ip_params_priority", + "ip_params_passive_interface", + "ip_params_retransmit_interval", + "ip_params_transmit_delay", + "mtu_ignore", + "network", + "priority", + "passive_interface", + "retransmit_interval", + "transmit_delay", + "message_digest_key", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + + # convert list of dicts to dicts of dicts + wantd = {} + haved = {} + for entry in self.want: + wantd.update({entry["name"]: entry}) + for entry in self.have: + haved.update({entry["name"]: entry}) + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._ospf_int_list_to_dict(entry) + + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + h_del = {} + for k, v in iteritems(haved): + if k in wantd or not wantd: + h_del.update({k: v}) + haved = h_del + for k, have in iteritems(haved): + self._compare(want={}, have=have) + wantd = {} + + # remove superfluous config for overridden + if self.state == "overridden": + for k, have in iteritems(haved): + if k not in wantd: + self._compare(want={}, have=have) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Ospf_interfaces network resource. + """ + begin = len(self.commands) + self._compare_addr_family(want=want, have=have) + if len(self.commands) != begin: + tmp = want or have + tmp.pop("address_family", {}) + self.commands.insert( + begin, + self._tmplt.render(tmp, "interfaces", False), + ) + + def _compare_addr_family(self, want, have): + wdict = want.get("address_family", {}) + hdict = have.get("address_family", {}) + for afi in ["ipv4", "ipv6"]: + w_family = wdict.pop(afi, {}) + h_family = hdict.pop(afi, {}) + for k in w_family.keys(): + if k == "afi": + continue + w = {"afi": afi, k: w_family[k]} + h = {"afi": afi, k: h_family.pop(k, {})} + if k == "ip_params": + self._compare_ip_params(want=w, have=h) + self.compare(parsers=self.parsers, want=w, have=h) + for k in h_family.keys(): + if k in ["afi"]: + continue + w = {"afi": afi, k: None} + h = {"afi": afi, k: h_family[k]} + if k == "ip_params": + w = {"afi": afi, k: {}} + self._compare_ip_params(want=w, have=h) + self.compare(parsers=self.parsers, want=w, have=h) + + def _compare_ip_params(self, want, have): + w_params = want.get("ip_params", {}) + h_params = have.get("ip_params", {}) + for afi in ["ipv4", "ipv6"]: + w_p = w_params.pop(afi, {}) + h_p = h_params.pop(afi, {}) + for k, params in iteritems(w_p): + if k == "afi": + continue + w = {"afi": afi, k: params} + h = {"afi": afi, k: h_p.pop(k, None)} + self.compare( + parsers=self.parsers, + want={"ip_params": w}, + have={"ip_params": h}, + ) + for k, params in iteritems(h_p): + if k == "afi": + continue + w = {"afi": afi, k: None} + h = {"afi": afi, k: params} + self.compare( + parsers=self.parsers, + want={"ip_params": w}, + have={"ip_params": h}, + ) + + def _ospf_int_list_to_dict(self, entry): + for name, family in iteritems(entry): + if family.get("ip_params"): + family_dict = {} + for entry in family["ip_params"]: + family_dict.update({entry["afi"]: entry}) + family["ip_params"] = family_dict + + if "address_family" in family: + addr_dict = {} + for entry in family.get("address_family", []): + addr_dict.update({entry["afi"]: entry}) + family["address_family"] = addr_dict + self._ospf_int_list_to_dict(family["address_family"]) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv2/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv2/ospfv2.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv2/ospfv2.py new file mode 100644 index 000000000..f7e85d4a2 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv2/ospfv2.py @@ -0,0 +1,840 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_ospfv2 class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + remove_empties, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) + + +class Ospfv2(ConfigBase): + """ + The eos_ospfv2 class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["ospfv2"] + + def __init__(self, module): + super(Ospfv2, self).__init__(module) + + def get_ospfv2_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + + ospfv2_facts = facts["ansible_network_resources"].get("ospfv2") + if not ospfv2_facts: + return [] + return ospfv2_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + + if self.state in self.ACTION_STATES: + existing_ospfv2_facts = self.get_ospfv2_facts() + else: + existing_ospfv2_facts = [] + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_ospfv2_facts)) + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_ospfv2_facts = self.get_ospfv2_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + if not self._module.params["running_config"]: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_ospfv2_facts( + data=self._module.params["running_config"], + ) + else: + changed_ospfv2_facts = self.get_ospfv2_facts() + if self.state in self.ACTION_STATES: + result["before"] = existing_ospfv2_facts + if result["changed"]: + result["after"] = changed_ospfv2_facts + elif self.state == "gathered": + result["gathered"] = changed_ospfv2_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_ospfv2_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_ospfv2_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + if ( + self.state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + self.state, + ), + ) + if self.state == "overridden": + commands = self._state_overridden(want, have) + elif self.state == "deleted": + commands = self._state_deleted(want, have) + elif self.state == "merged" or self.state == "rendered": + commands = self._state_merged(want, have) + elif self.state == "replaced": + commands = self._state_replaced(want, have) + return commands + + def _get_os_version(self): + os_version = "4.20" + if self._connection(): + os_version = self._connection.get_device_info()[ + "network_os_version" + ] + return os_version + + def _state_replaced(self, want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for w in want["processes"]: + del_cmds = w.copy() + add_cmds = {} + for h in have["processes"]: + if h["process_id"] != w["process_id"]: + continue + if w.get("vrf"): + if w["vrf"] != h["vrf"]: + self._module.fail_json( + msg="Value of vrf and process_id does not match the config present in the device", + ) + break + del_instance_list = self.compare_dicts(h, w) + if del_instance_list: + del_cmds = {"processes": del_instance_list} + add_instance_list = self.compare_dicts(w, h) + if add_instance_list: + add_cmds = {"processes": add_instance_list} + + return_command = self.del_commands(del_cmds, have) + for command in return_command: + if "exit" not in command: + commands.append(command) + return_command = self.add_commands(add_cmds, have) + for command in return_command: + if "router ospf" in command: + if command not in commands: + commands.append(command) + else: + commands.append(command) + commandset = [] + if commands: + commandset.append(commands[0]) + for cmd in commands[1::]: + if "router ospf" in cmd and commandset[-1] != "exit": + commandset.append("exit") + commandset.append(cmd) + if commandset[-1] != "exit": + commandset.append("exit") + return commandset + + def _state_overridden(self, want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for h in have["processes"]: + present = False + for w in want["processes"]: + if h["process_id"] == w["process_id"]: + present = True + break + if not present: + commands.append("no router ospf " + str(h["process_id"])) + replace_cmds = self._state_replaced(want, have) + for cmd in replace_cmds: + commands.append(cmd) + return commands + + def _state_merged(self, want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + + return self.set_commands(want, have) + + def _state_deleted(self, want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + return_command = self.del_commands(want, have) + if return_command: + for cmd in return_command: + if "no exit" in cmd: + cmd = "exit" + commands.append(cmd) + return commands + + def set_commands(self, want, have): + commands = [] + instance_list = [] + for w in want["processes"]: + present = False + c = [] + if have and not have.get("processes"): + instance_list = want["processes"] + break + if have: + for h in have["processes"]: + if w["process_id"] == h["process_id"]: + if w.get("vrf"): + if w["vrf"] != h["vrf"]: + self._module.fail_json( + msg="Value of vrf and process_id does not match the config present in the device", + ) + continue + present = True + c = self.compare_dicts(w, h) + break + if c: + instance_list.append(c[0]) + if not present: + if w["vrf"] in _get_vrf_list(have): + self._module.fail_json( + msg="Value of vrf and process_id does not match the config present in the device", + ) + instance_list.append(w) + instance_dict = {"processes": instance_list} + return_command = self.add_commands(instance_dict, have) + for command in return_command: + commands.append(command) + return commands + + def compare_dicts(self, want_inst, have_inst): + want_dict = remove_empties(want_inst) + have = have_inst + ospf_list = [] + return_ospf_dict = {} + for w_key in want_dict.keys(): + if not have.get(w_key): + return_ospf_dict.update({w_key: want_dict[w_key]}) + elif ( + isinstance(want_dict[w_key], str) + or isinstance(want_dict[w_key], bool) + or isinstance(want_dict[w_key], int) + ): + if want_dict[w_key] != have[w_key]: + return_ospf_dict.update({w_key: want_dict[w_key]}) + elif isinstance(want_dict[w_key], dict): + diff = dict_diff(have.get(w_key, {}), want_dict[w_key]) + if diff: + return_ospf_dict.update({w_key: diff}) + elif isinstance(want_dict[w_key], list): + if have.get(w_key): + compare_list = self.compare_ospf_list( + want_dict[w_key], + have.get(w_key), + w_key, + ) + if compare_list: + return_ospf_dict.update({w_key: compare_list}) + else: + if want_dict[w_key] != have.get(w_key): + return_ospf_dict.update({w_key: want_dict[w_key]}) + + if return_ospf_dict: + if want_dict.get("vrf"): + return_ospf_dict.update( + { + "process_id": want_dict["process_id"], + "vrf": want_dict["vrf"], + }, + ) + else: + return_ospf_dict.update( + {"process_id": want_dict["process_id"]}, + ) + ospf_list.append(return_ospf_dict) + return ospf_list + + def compare_ospf_list(self, w_list, h_list, l_key): + return_list = [] + for w in w_list: + present = False + for h in h_list: + diff = dict_diff(h, w) + if not diff: + present = True + break + if not present: + return_list.append(w) + return return_list + + def add_commands(self, want, have): + commands = [] + if not want: + return commands + for ospf_params in want["processes"]: + commands.append(_get_router_command(ospf_params)) + if ospf_params.get("traffic_engineering"): + commands.append("traffic-engineering") + if ospf_params.get("adjacency"): + threshold = ospf_params["adjacency"]["exchange_start"][ + "threshold" + ] + commands.append( + "adjacency exchange-start threshold " + str(threshold), + ) + if ospf_params.get("areas"): + command_list = _parse_areas(ospf_params["areas"]) + for c in command_list: + commands.append(c) + if ospf_params.get("auto_cost"): + commands.append( + "auto-cost reference-bandwidth " + + ospf_params["auto_cost"], + ) + if ospf_params.get("bfd"): + os_version = self._get_os_version() + if os_version < "4.23": + commands.append("bfd all-interfaces") + else: + commands.append("bfd default") + if ospf_params.get("default_information"): + commands.append( + _parse_default_information( + ospf_params["default_information"], + ), + ) + if ospf_params.get("default_metric"): + commands.append( + "default-metric" + + " " + + str(ospf_params["default_metric"]), + ) + if ospf_params.get("distance"): + for k, v in ospf_params["distance"].items(): + if v: + k = re.sub(r"_", "-", k) + commands.append("distance ospf " + k + " " + str(v)) + if ospf_params.get("distribute_list"): + commands.append( + "distribute-list " + + ospf_params["distribute_list"].keys()[0] + + " " + + ospf_params["distribute_list"].values()[0] + + " in", + ) + if ospf_params.get("dn_bit_ignore"): + commands.append("dn-bit-ignore") + if ospf_params.get("graceful_restart"): + if ospf_params["graceful_restart"].get("set"): + commands.append("graceful-restart") + else: + commands.append( + "graceful-restart grace-period " + + str( + ospf_params["graceful_restart"].get( + "grace_period", + ), + ), + ) + if ospf_params.get("graceful_restart_helper"): + commands.append("graceful-restart-helper") + if ospf_params.get("log_adjacency_changes"): + cmd = "log-adjacency-changes" + if ospf_params["log_adjacency_changes"].get("detail"): + cmd = cmd + " detail" + commands.append(cmd) + if ospf_params.get("max_lsa"): + commands.append(_parse_max_lsa(ospf_params["max_lsa"])) + if ospf_params.get("max_metric"): + commands.append(_parse_max_metric(ospf_params["max_metric"])) + if ospf_params.get("maximum_paths"): + commands.append( + "maximum-paths " + str(ospf_params["maximum_paths"]), + ) + if ospf_params.get("mpls_ldp"): + commands.append("mpls ldp sync default") + if ospf_params.get("networks"): + command_list = _parse_networks(ospf_params["networks"]) + for c in command_list: + commands.append(c) + if ospf_params.get("passive_interface"): + if "interface_list" in ospf_params["passive_interface"].keys(): + commands.append( + "passive-interface " + + ospf_params["passive_interface"]["interface_list"], + ) + else: + commands.append("passive-interface default") + if ospf_params.get("point_to_point"): + commands.append("point-to-point routes") + if ospf_params.get("redistribute"): + command_list = _parse_redistribute(ospf_params["redistribute"]) + for c in command_list: + commands.append(c) + if ospf_params.get("retransmission_threshold"): + commands.append( + "retransmission-threshold lsa " + + str(ospf_params["retransmission_threshold"]), + ) + if ospf_params.get("rfc1583compatibility"): + commands.append("compatible rfc1583") + if ospf_params.get("router_id"): + commands.append("router-id " + ospf_params.get("router_id")) + if ospf_params.get("summary_address"): + commands.append( + _parse_summary_address(ospf_params["summary_address"]), + ) + if ospf_params.get("timers"): + os_version = self._get_os_version() + command_list = _parse_timers(ospf_params["timers"], os_version) + for c in command_list: + commands.append(c) + commands.append("exit") + commandset = [] + for command in commands: + commandset.append(command.strip()) + return commandset + + def del_commands(self, want, have): + commands = [] + other_commands = 0 + want = remove_empties(want) + if want.get("processes"): + for w_inst in want["processes"]: + router_context = 0 + d_cmds = [] + instance_list = [] + if have.get("processes"): + for h_inst in have["processes"]: + if h_inst["process_id"] == w_inst["process_id"]: + if w_inst.get("vrf") and w_inst.get( + "vrf", + ) == h_inst.get("vrf"): + if list(w_inst.keys()) == [ + "process_id", + "vrf", + ]: + commands.append( + "no router ospf " + + str(w_inst["process_id"]) + + " vrf " + + w_inst["vrf"], + ) + router_context = 1 + if len(w_inst.keys()) == 1 and list( + w_inst.keys(), + ) == ["process_id"]: + commands.append( + "no router ospf " + + str(w_inst["process_id"]), + ) + router_context = 1 + if not router_context: + instance_list = self.compare_dicts( + w_inst, + h_inst, + ) + if not instance_list: + del_want = {"processes": [w_inst]} + d_cmds = self.add_commands(del_want, have) + for cmd in d_cmds: + if "router ospf" in cmd: + other_commands = 0 + if cmd not in commands: + commands.append(cmd) + else: + cmd = "no " + cmd + if cmd not in commands: + commands.append(cmd) + other_commands += 1 + if ( + not other_commands + and len(commands) == 1 + and not router_context + ): + if ( + "no" not in commands[0] + and "router ospf" in commands[0] + ): + commands[0] = "no " + commands[0] + return commands + + +def _get_router_command(inst): + command = "" + if inst.get("vrf") and inst.get("vrf") != "default": + command = ( + "router ospf " + str(inst["process_id"]) + " vrf " + inst["vrf"] + ) + else: + command = "router ospf " + str(inst["process_id"]) + return command + + +def _get_vrf_list(want): + vrf_list = [] + if not want: + return vrf_list + for w in want["processes"]: + if w.get("vrf"): + vrf_list.append(w["vrf"]) + return vrf_list + + +def _parse_areas(areas): + command = [] + for area in areas: + area_cmd = "area " + area["area_id"] + if area.get("default_cost"): + command.append( + area_cmd + " default-cost " + str(area.get("default_cost")), + ) + elif area.get("filter"): + command.append( + area_cmd + " " + _parse_areas_filter(area["filter"]), + ) + elif area.get("not_so_stubby"): + command.append( + area_cmd + + " " + + _parse_areas_filter_notsostubby(area["not_so_stubby"]), + ) + elif area.get("nssa"): + command.append( + area_cmd + " " + _parse_areas_filter_nssa(area["nssa"]), + ) + elif area.get("range"): + command.append(area_cmd + " " + _parse_areas_range(area["range"])) + return command + + +def _parse_areas_filter(filter_dict): + filter_cmd = "filter " + if filter_dict.get("prefix_list"): + filter_cmd = filter_cmd + filter_dict.get("filter") + elif filter_dict.get("address"): + filter_cmd = filter_cmd + filter_dict.get("address") + else: + filter_cmd = ( + filter_cmd + + filter_dict.get("subnet_address") + + " " + + filter_dict.get("subnet_mask") + ) + return filter_cmd + + +def _parse_areas_filter_notsostubby(nss_dict): + nss_cmd = "not-so-stubby " + if nss_dict.get("default_information_originate"): + nss_cmd = nss_cmd + "default-information-originate " + for def_keys in nss_dict["default_information_originate"].keys(): + if ( + def_keys == "nssa_only" + and nss_dict["default_information_originate"]["nssa_only"] + ): + nss_cmd = nss_cmd + " nssa-only " + elif nss_dict["default_information_originate"].get(def_keys): + nss_cmd = ( + nss_cmd + + def_keys + + " " + + nss_dict["default_information_originate"][def_keys] + ) + elif "lsa" in nss_dict.keys() and nss_dict.get("lsa"): + nss_cmd = nss_cmd + " lsa type-7 convert type-5" + elif "no_summary" in nss_dict.keys() and nss_dict.get("no_summary"): + nss_cmd = nss_cmd + " no-summary" + elif "nssa_only" in nss_dict.keys() and nss_dict.get("nssa_only"): + nss_cmd = nss_cmd + " nssa-only" + return nss_cmd + + +def _parse_areas_filter_nssa(nss_dict): + nss_cmd = "nssa " + if nss_dict.get("default_information_originate"): + nss_cmd = nss_cmd + "default-information-originate " + for def_keys in nss_dict["default_information_originate"].keys(): + if ( + def_keys == "nssa_only" + and nss_dict["default_information_originate"]["nssa_only"] + ): + nss_cmd = nss_cmd + " nssa-only " + elif nss_dict["default_information_originate"].get(def_keys): + nss_cmd = ( + nss_cmd + + def_keys + + " " + + nss_dict["default_information_originate"][def_keys] + ) + elif "no_summary" in nss_dict.keys() and nss_dict.get("no_summary"): + nss_cmd = nss_cmd + " no-summary" + elif "nssa_only" in nss_dict.keys() and nss_dict.get("nssa_only"): + nss_cmd = nss_cmd + " nssa-only" + return nss_cmd + + +def _parse_areas_range(range_dict): + range_cmd = " range " + if range_dict.get("address"): + range_cmd = range_cmd + range_dict["address"] + if range_dict.get("subnet_address"): + range_cmd = ( + range_cmd + + range_dict["subnet_address"] + + " " + + range_dict["subnet_mask"] + ) + if range_dict.get("advertise") is not None: + if range_dict["advertise"]: + range_cmd = range_cmd + " advertise " + else: + range_cmd = range_cmd + " not-advertise " + if range_dict.get("cost"): + range_cmd = range_cmd + " cost " + str(range_dict["cost"]) + return range_cmd + + +def _parse_default_information(default_dict): + def_cmd = "default-information originate" + for def_key in sorted(default_dict.keys()): + if def_key == "always": + if default_dict.get(def_key): + def_cmd = def_cmd + " " + def_key + elif def_key in ["metric", "metric_type", "route_map"]: + if default_dict.get(def_key): + k = re.sub(r"_", "-", def_key) + def_cmd = def_cmd + " " + k + " " + str(default_dict[def_key]) + return def_cmd + + +def _parse_max_lsa(max_lsa_dict): + max_lsa_cmd = "max-lsa " + if max_lsa_dict.get("count"): + max_lsa_cmd = max_lsa_cmd + " " + str(max_lsa_dict["count"]) + if max_lsa_dict.get("threshold"): + max_lsa_cmd = max_lsa_cmd + " " + str(max_lsa_dict["threshold"]) + for lsa_key, lsa_val in sorted(max_lsa_dict.items()): + if lsa_key == "warning" and lsa_val: + max_lsa_cmd = max_lsa_cmd + " warning-only" + elif lsa_key in ["ignore_count", "reset_time", "ignore_time"]: + if lsa_val: + k = re.sub(r"_", "-", lsa_key) + max_lsa_cmd = max_lsa_cmd + " " + k + " " + str(lsa_val) + " " + return max_lsa_cmd + + +def _parse_max_metric(max_metric_dict): + metric_cmd = "max-metric router-lsa " + for k, v in max_metric_dict["router_lsa"].items(): + if not v: + continue + if k == "include_stub" and v: + metric_cmd = metric_cmd + " include-stub" + elif k == "on_startup": + metric_cmd = metric_cmd + " on-startup " + str(v["wait_period"]) + elif k in ["summary_lsa", "external_lsa"]: + k = re.sub(r"_", "-", k) + if v.get("set"): + metric_cmd = metric_cmd + " " + k + else: + metric_cmd = ( + metric_cmd + " " + k + " " + str(v.get("max_metric_value")) + ) + return metric_cmd + + +def _parse_networks(net_list): + network_cmd = [] + for net_dict in net_list: + net_cmd = "network " + if net_dict.get("prefix"): + net_cmd = net_cmd + net_dict.get("prefix") + else: + net_cmd = ( + net_cmd + + net_dict.get("network_address") + + " " + + net_dict.get("mask") + ) + if net_dict.get("area"): + net_cmd = net_cmd + " area " + net_dict.get("area") + network_cmd.append(net_cmd) + return network_cmd + + +def _parse_redistribute(r_list): + rcmd_list = [] + for r_dict in r_list: + r_cmd = "redistribute " + r_cmd = r_cmd + r_dict["routes"] + if r_dict.get("isis_level"): + k = re.sub(r"_", "-", r_dict["isis_level"]) + r_cmd = r_cmd + " " + k + if r_dict.get("route_map"): + r_cmd = r_cmd + " route-map " + r_dict["route_map"] + rcmd_list.append(r_cmd) + return rcmd_list + + +def _parse_summary_address(addr_dict): + sum_cmd = "summary-address " + if addr_dict.get("prefix"): + sum_cmd = sum_cmd + addr_dict.get("prefix") + else: + sum_cmd = ( + sum_cmd + addr_dict.get("address") + " " + addr_dict.get("mask") + ) + if "attribute_map" in addr_dict.keys(): + sum_cmd = sum_cmd + " attribute-map " + addr_dict["attribute_map"] + elif addr_dict.get("not_advertise"): + sum_cmd = sum_cmd + " not-advertise " + elif "tag" in addr_dict.keys(): + sum_cmd = sum_cmd + " tag " + addr_dict["tag"] + return sum_cmd + + +def _parse_timers(timers_list, os_version="4.20"): + timers_cmd = [] + for t_dict in timers_list: + t_cmd = "timers " + for t_key in t_dict.keys(): + if not t_dict.get(t_key): + break + if t_key == "lsa": + if t_dict["lsa"].get("rx"): + if os_version < "4.23": + t_cmd = ( + t_cmd + + "lsa arrival " + + str(t_dict["lsa"]["rx"]["min_interval"]) + ) + else: + t_cmd = ( + t_cmd + + "lsa rx min interval " + + str(t_dict["lsa"]["rx"]["min_interval"]) + ) + else: + t_cmd = ( + t_cmd + + "lsa tx delay initial " + + str(t_dict["lsa"]["tx"]["delay"]["initial"]) + + " " + + str(t_dict["lsa"]["tx"]["delay"]["min"]) + + " " + + str(t_dict["lsa"]["tx"]["delay"]["max"]) + ) + elif t_key == "out_delay": + t_cmd = t_cmd + " out-delay " + str(t_dict["out_delay"]) + elif t_key == "pacing": + t_cmd = t_cmd + " pacing flood " + str(t_dict["pacing"]) + elif t_key == "spf": + if "seconds" in t_dict["spf"].keys(): + t_cmd = t_cmd + " spf " + str(t_dict["spf"]["seconds"]) + else: + t_cmd = ( + t_cmd + + "spf delay initial " + + str(t_dict["spf"]["initial"]) + + " " + + str(t_dict["spf"]["max"]) + + " " + + str(t_dict["spf"]["min"]) + ) + elif t_key == "throttle": + if t_dict["throttle"]["attr"] == "lsa": + t_cmd = t_cmd + "throttle lsa all " + else: + t_cmd = t_cmd + "throttle spf " + t_cmd = ( + t_cmd + + str(t_dict["throttle"]["initial"]) + + " " + + str(t_dict["throttle"]["min"]) + + " " + + str(t_dict["throttle"]["max"]) + ) + timers_cmd.append(t_cmd) + return timers_cmd diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv3/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv3/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv3/ospfv3.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv3/ospfv3.py new file mode 100644 index 000000000..a16d163e5 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/ospfv3/ospfv3.py @@ -0,0 +1,392 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_ospfv3 config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +import re + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, + get_from_dict, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.ospfv3 import ( + Ospfv3Template, +) + + +class Ospfv3(ResourceModule): + """ + The eos_ospfv3 config class + """ + + def __init__(self, module): + super(Ospfv3, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="ospfv3", + tmplt=Ospfv3Template(module=module), + ) + self.parsers = [ + "vrf", + "address_family", + "adjacency", + "auto_cost", + "area.default_cost", + "area.authentication", + "area.encryption", + "area.nssa", + "area.ranges", + "area.stub", + "bfd", + "default_information", + "default_metric", + "distance", + "fips_restrictions", + "graceful_restart", + "graceful_restart_period", + "graceful_restart_helper", + "log_adjacency_changes", + "max_metric", + "maximum_paths", + "passive_interface", + "redistribute", + "router_id", + "shutdown", + "timers.out_delay", + "timers.pacing", + "timers.lsa", + "timers.spf", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + wantd = {} + haved = {} + for entry in self.want.get("processes", []): + wantd.update({entry["vrf"]: entry}) + for entry in self.have.get("processes", []): + haved.update({entry["vrf"]: entry}) + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._ospf_list_to_dict(entry) + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + h_del = {} + for k, v in iteritems(haved): + if k in wantd or not wantd: + h_del.update({k: v}) + wantd = {} + haved = h_del + + # remove superfluous config for overridden and deleted + if self.state in ["overridden", "deleted"]: + for k, have in iteritems(haved): + if k not in wantd and have.get("vrf") == k: + self.commands.append(self._tmplt.render(have, "vrf", True)) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Ospfv3 network resource. + """ + begin = len(self.commands) + self._af_compare(want=want, have=have) + self._global_compare(want=want, have=have) + + if len(self.commands) != begin or (not have and want): + self.commands.insert( + begin, + self._tmplt.render(want or have, "vrf", False), + ) + self.commands.append("exit") + + def _global_compare(self, want, have): + for name, entry in iteritems(want): + if name == "timers": + if entry.get("throttle"): + throttle = entry.pop("throttle") + modified = {} + if throttle.get("lsa"): + modified["lsa"] = { + "max": throttle["max"], + "min": throttle["min"], + "initial": throttle["initial"], + "direction": "tx", + } + if throttle.get("spf"): + modified["spf"] = { + "max": throttle["max"], + "min": throttle["min"], + "initial": throttle["initial"], + } + entry.update(modified) + self._module.warn( + " ** The 'timers' argument has been changed to have separate 'lsa' and 'spf' keys and 'throttle' has been deprecated. ** " + " \n** Your task has been modified to use {0}. ** " + " \n** timers.throttle will be removed after '2024-01-01' ** ".format( + entry, + ), + ) + if entry.get("lsa") and not isinstance(entry["lsa"], dict): + modified = {} + if not isinstance(entry["lsa"], int): + # if neither old or new format, fail ! + self._module.fail_json( + msg="The lsa key takes a dictionary of arguments. Please consult the documentation for more details", + ) + modified = { + "timers": { + "lsa": {"direction": "rx", "min": entry["lsa"]}, + }, + } + self._module.warn( + " ** 'timers lsa arrival' has changed to 'timers lsa rx min interval' from eos 4.23 onwards. ** " + " \n** Your task has been modified to use {0}. ** " + " \n** timers.lsa of type int will be removed after '2024-01-01' ** ".format( + modified, + ), + ) + entry["lsa"] = modified["timers"]["lsa"] + if name in ["vrf", "address_family"]: + continue + if not isinstance(entry, dict) and name != "areas": + self.compare( + parsers=self.parsers, + want={name: entry}, + have={name: have.pop(name, None)}, + ) + else: + if name == "areas" and entry: + self._areas_compare( + want={name: entry}, + have={name: have.get(name, {})}, + ) + else: + # passing dict without vrf, inorder to avoid no router ospfv3 command + h = {} + for i in have: + if i != "vrf": + h.update({i: have[i]}) + self.compare( + parsers=self.parsers, + want={name: entry}, + have={name: h.pop(name, {})}, + ) + # remove remaining items in have for replaced + for name, entry in iteritems(have): + if name in ["vrf", "address_family"]: + continue + if not isinstance(entry, dict): + self.compare( + parsers=self.parsers, + want={name: want.pop(name, None)}, + have={name: entry}, + ) + else: + # passing dict without vrf, inorder to avoid no router ospfv3 command + self.compare( + parsers=self.parsers, + want={name: want.pop(name, {})}, + have={name: entry}, + ) + + def _af_compare(self, want, have): + wafs = want.get("address_family", {}) + hafs = have.get("address_family", {}) + for name, entry in iteritems(wafs): + begin = len(self.commands) + if "timers" in entry: + if entry["timers"].get("throttle"): + throttle = entry["timers"].pop("throttle") + modified = {} + if throttle.get("lsa"): + modified["lsa"] = { + "max": throttle["max"], + "min": throttle["min"], + "initial": throttle["initial"], + "direction": "tx", + } + if throttle.get("spf"): + modified["spf"] = { + "max": throttle["max"], + "min": throttle["min"], + "initial": throttle["initial"], + } + entry["timers"].update(modified) + self._module.warn( + " ** The 'timers' argument has been changed to have separate 'lsa' and 'spf' keys and 'throttle' has been deprecated. ** " + " \n** Your task has been modified to use {0}. ** " + " \n** timers.throttle will be removed after '2024-01-01' ** ".format( + entry["timers"], + ), + ) + if entry["timers"].get("lsa") and not isinstance( + entry["timers"]["lsa"], + dict, + ): + if not isinstance(entry["timers"]["lsa"], int): + # It doesn't match the new format or the old format, fail here + self._module.fail_json( + msg="The lsa key takes a dictionary of arguments. Please consult the documentation for more details", + ) + modified = { + "timers": { + "lsa": { + "direction": "rx", + "min": entry["timers"]["lsa"], + }, + }, + } + self._module.warn( + " ** 'timers lsa arrival' has changed to 'timers lsa rx min interval' from eos 4.23 onwards. ** " + " \n** Your task has been modified to use {0}. ** " + " \n** timers.lsa of type int will be removed after '2024-01-01' ** ".format( + modified, + ), + ) + entry["timers"]["lsa"] = modified["timers"]["lsa"] + self._compare_lists(want=entry, have=hafs.get(name, {})) + self._areas_compare(want=entry, have=hafs.get(name, {})) + self.compare( + parsers=self.parsers, + want=entry, + have=hafs.pop(name, {}), + ) + if ( + len(self.commands) != begin + and "afi" in entry + and entry["afi"] != "router" + ): + self._rotate_commands(begin=begin) + self.commands.insert( + begin, + self._tmplt.render(entry, "address_family", False), + ) + self.commands.append("exit") + for name, entry in iteritems(hafs): + self.addcmd(entry, "address_family", True) + + def _rotate_commands(self, begin=0): + # move negate commands to beginning + for cmd in self.commands[begin::]: + negate = re.match(r"^no .*", cmd) + if negate: + self.commands.insert( + begin, + self.commands.pop(self.commands.index(cmd)), + ) + begin += 1 + + def _areas_compare(self, want, have): + wareas = want.get("areas", {}) + hareas = have.get("areas", {}) + for name, entry in iteritems(wareas): + self._area_compare(want=entry, have=hareas.pop(name, {})) + for name, entry in iteritems(hareas): + self._area_compare(want={}, have=entry) + + def _area_compare(self, want, have): + parsers = [ + "area.default_cost", + "area.encryption", + "area.authentication", + "area.nssa", + "area.stub", + ] + self.compare(parsers=parsers, want=want, have=have) + self._area_compare_lists(want=want, have=have) + + def _area_compare_lists(self, want, have): + for attrib in ["ranges"]: + wdict = want.get(attrib, {}) + hdict = have.get(attrib, {}) + for key, entry in iteritems(wdict): + if entry != hdict.pop(key, {}): + entry["area_id"] = want["area_id"] + self.addcmd(entry, "area.{0}".format(attrib), False) + # remove remaining items in have for replaced + for entry in hdict.values(): + entry["area_id"] = have["area_id"] + self.addcmd(entry, "area.{0}".format(attrib), True) + + def _compare_lists(self, want, have): + for attrib in ["redistribute"]: + wdict = get_from_dict(want, attrib) or {} + hdict = get_from_dict(have, attrib) or {} + for key, entry in iteritems(wdict): + if entry != hdict.pop(key, {}): + self.addcmd(entry, attrib, False) + # remove remaining items in have for replaced + for entry in hdict.values(): + self.addcmd(entry, attrib, True) + + def _ospf_list_to_dict(self, entry): + for name, proc in iteritems(entry): + for area in proc.get("areas", []): + if "ranges" in area: + range_dict = {} + for entry in area.get("ranges", []): + range_dict.update({entry["address"]: entry}) + area["ranges"] = range_dict + areas_dict = {} + for entry in proc.get("areas", []): + areas_dict.update({entry["area_id"]: entry}) + proc["areas"] = areas_dict + + redis_dict = {} + for entry in proc.get("redistribute", []): + redis_dict.update({entry["routes"]: entry}) + proc["redistribute"] = redis_dict + + if "address_family" in proc: + addr_dict = {} + for entry in proc.get("address_family", []): + addr_dict.update({entry["afi"]: entry}) + proc["address_family"] = addr_dict + self._ospf_list_to_dict(proc["address_family"]) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/prefix_lists/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/prefix_lists/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/prefix_lists/prefix_lists.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/prefix_lists/prefix_lists.py new file mode 100644 index 000000000..347f8d426 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/prefix_lists/prefix_lists.py @@ -0,0 +1,217 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_prefix_lists config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + dict_merge, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.prefix_lists import ( + Prefix_listsTemplate, +) + + +class Prefix_lists(ResourceModule): + """ + The eos_prefix_lists config class + """ + + def __init__(self, module): + super(Prefix_lists, self).__init__( + empty_fact_val=[], + facts_module=Facts(module), + module=module, + resource="prefix_lists", + tmplt=Prefix_listsTemplate(), + ) + self.parsers = [] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + + wantd = {} + haved = {} + + for entry in self.want: + wantd.update({entry["afi"]: entry}) + for entry in self.have: + haved.update({entry["afi"]: entry}) + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._prefix_lists_list_to_dict(entry) + + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + h_del = {} + for k, v in iteritems(haved): + if k in wantd or not wantd: + h_del.update({k: v}) + haved = h_del + wantd = {} + + # remove superfluous config for overridden and deleted + if self.state in ["overridden", "deleted"]: + for k, have in iteritems(haved): + if k not in wantd: + self._compare(want={}, have=have) + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Prefix_lists network resource. + """ + for k, v in iteritems(want): + if k == "afi": + continue + afi = want["afi"] + for pk, pv in iteritems(v): + begin = len(self.commands) + w_parent = {"afi": afi, "prefix_lists": {"name": pk}} + if pv.get("entries"): + self._compare_prefix_lists(afi, pk, pv, have) + if have.get("prefix_lists"): + if have["prefix_lists"].get(pk): + h_parent = {"afi": afi, "prefix_lists": {"name": pk}} + if begin != len(self.commands): + self.commands.insert( + begin, + self._tmplt.render( + w_parent or h_parent, + "prefixlist.name", + False, + ), + ) + for hk, hv in iteritems(have): + if hk == "afi": + continue + h_afi = have["afi"] + for hpk, hpv in iteritems(hv): + self.commands.append( + self._tmplt.render( + {"afi": h_afi, "prefix_lists": {"name": hpk}}, + "prefixlist.name", + True, + ), + ) + + def _compare_prefix_lists(self, afi, pk, w_list, have): + parser = ["prefixlist.entry", "prefixlist.resequence"] + for ek, ev in iteritems(w_list): + if ek == "name": + continue + h_child = {} + if have.get("prefix_lists"): + if have["prefix_lists"].get(pk): + if have["prefix_lists"][pk].get(ek): + self._compare_seq( + afi, + w_list["entries"], + have["prefix_lists"][pk][ek], + ) + for seq, seq_val in iteritems( + have["prefix_lists"][pk][ek], + ): + h_child = { + "afi": afi, + "prefix_lists": {"entries": {seq: seq_val}}, + } + self.compare(parsers=parser, want={}, have=h_child) + have["prefix_lists"].pop(pk) + else: + self._compare_seq(afi, w_list["entries"], {}) + else: + self._compare_seq(afi, w_list["entries"], {}) + + def _compare_seq(self, afi, w, h): + wl_child = {} + hl_child = {} + parser = ["prefixlist.entry", "prefixlist.resequence"] + for seq, ent in iteritems(w): + seq_diff = {} + wl_child = {"afi": afi, "prefix_lists": {"entries": {seq: ent}}} + if h.get(seq): + hl_child = { + "afi": afi, + "prefix_lists": {"entries": {seq: h.pop(seq)}}, + } + seq_diff = dict_diff( + hl_child["prefix_lists"]["entries"][seq], + wl_child["prefix_lists"]["entries"][seq], + ) + if seq_diff: + if self.state == "merged": + self._module.fail_json( + msg="Sequence number " + + str(seq) + + " is already present. Use replaced/overridden operation to change the configuration", + ) + + self.compare( + parsers="prefixlist.entry", + want={}, + have=hl_child, + ) + self.compare(parsers=parser, want=wl_child, have=hl_child) + + def _prefix_lists_list_to_dict(self, entry): + for afi, plist in iteritems(entry): + if "prefix_lists" in plist: + pl_dict = {} + for el in plist["prefix_lists"]: + if "entries" in el: + ent_dict = {} + for en in el["entries"]: + if "sequence" not in en.keys(): + num = "seq" + else: + num = en["sequence"] + ent_dict.update({num: en}) + el["entries"] = ent_dict + for el in plist["prefix_lists"]: + pl_dict.update({el["name"]: el}) + plist["prefix_lists"] = pl_dict diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/route_maps/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/route_maps/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/route_maps/route_maps.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/route_maps/route_maps.py new file mode 100644 index 000000000..7f799d793 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/route_maps/route_maps.py @@ -0,0 +1,349 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_route_maps config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.route_maps import ( + Route_mapsTemplate, +) + + +class Route_maps(ResourceModule): + """ + The eos_route_maps config class + """ + + def __init__(self, module): + super(Route_maps, self).__init__( + empty_fact_val=[], + facts_module=Facts(module), + module=module, + resource="route_maps", + tmplt=Route_mapsTemplate(), + ) + self.parsers = [ + "continue", + "route_map.copy", + "route_map.rename", + "description", + "sub_route_map", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + wantd = {} + haved = {} + + for entry in self.want: + wantd.update({entry["route_map"]: entry}) + for entry in self.have: + haved.update({entry["route_map"]: entry}) + + # turn all lists of dicts into dicts prior to merge + for entry in wantd, haved: + self._route_maps_list_to_dict(entry) + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + h_del = {} + for k, v in iteritems(haved): + if k in wantd or not wantd: + h_del.update({k: v}) + haved = h_del + for rmap, val in iteritems(haved): + self.addcmd({"route_map": rmap}, "route_map.name", True) + wantd = {} + + # remove superfluous config for overridden + if self.state in ["overridden"]: + for k, have in iteritems(haved): + for entry, val in iteritems(have.get("entries", {})): + if not wantd.get(k) or entry not in wantd[k].get( + "entries", + {}, + ): + self._compare_maps(want={}, have={entry: val}) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Route_maps network resource. + """ + self._compare_entries(want=want, have=have) + + def _compare_entries(self, want, have): + w_entries = want.get("entries", {}) + h_entries = have.get("entries", {}) + # overridden + if not w_entries: + for k, v in iteritems(h_entries): + self._compare_maps({}, {k: v}) + for k, v in iteritems(w_entries): + before_maps = len(self.commands) + self._compare_maps({k: v}, {k: h_entries.get(k, {})}) + after_maps = len(self.commands) + self._compare_match(v, h_entries.get(k, {})) + self._comapre_set(v, h_entries.get(k, {})) + for entry_k, entry_v in iteritems(v): + h = {} + if h_entries.get(k): + h = {"entries": {entry_k: h_entries[k].pop(entry_k, {})}} + self.compare( + parsers=self.parsers, + want={"entries": {entry_k: entry_v}}, + have=h, + ) + for h_k, h_v in iteritems(h_entries.pop(k, {})): + self.compare( + parsers=self.parsers, + have={"entries": {h_k: h_v}}, + want={}, + ) + + parent_present = False + for c in self.commands[before_maps::]: + if c.startswith("route-map"): + parent_present = True + break + if ( + before_maps == after_maps and len(self.commands) > after_maps + ) or (not parent_present and len(self.commands) > after_maps): + self._compare_maps({k: v}, {}) + self.commands.insert(after_maps, self.commands.pop(-1)) + + def _compare_maps(self, want, have): + map_in_want = [] + for k, v in iteritems(want): + map_name = k.split(" ")[0] + map_in_want.append(map_name) + w = {} + h = {} + h_entry = {} + for entry_k, entry_v in iteritems(v): + if entry_k not in [ + "continue_sequence", + "sub_route_map", + "description", + "match", + "set", + ]: + w.update({entry_k: entry_v}) + if have.get(k): + h.update({entry_k: have[k].pop(entry_k, {})}) + if h: + h_entry = {"route_map": map_name, "entries": h} + parser = self._select_parser(w) + self.compare( + parsers=parser, + want={"route_map": map_name, "entries": w}, + have=h_entry, + ) + for k, v in iteritems(have): + map_name = k.split(" ")[0] + if k not in want.keys() and self.state in [ + "replaced", + "overridden", + ]: + w_negate = {} + if map_name not in map_in_want and self.state == "replaced": + continue + parser = self._select_parser(v) + w_negate.update({"route_map": map_name, "entries": v}) + self.addcmd(w_negate, parser, True) + + def _select_parser(self, w): + parser = "" + if ( + "statement" in w.keys() + and "action" in w.keys() + and "sequence" in w.keys() + ): + parser = "route_map.statement.entries" + elif "statement" in w.keys() and "action" in w.keys(): + parser = "route_map.statement.action" + elif "statement" in w.keys(): + parser = "route_map.statement.name" + elif "action" in w.keys() and "sequence" in w.keys(): + parser = "route_map.entries" + elif "action" in w.keys(): + parser = "route_map.action" + else: + parser = "route_map.name" + return parser + + def _compare_match(self, want, have): + parsers = [ + "match.aggregate_role", + "match.as", + "match.as_path", + "match.community.instances", + "match.community.list", + "match.extcommunity", + "match.invert.aggregate_role", + "match.invert.as_path", + "match.invert.community.instances", + "match.invert.community.list", + "match.invert.extcommunity", + "match.interface", + "match.ip", + "match.ipaddress", + "match.ipv6", + "match.ipv6address", + "match.largecommunity", + "match.isis", + "match.local_pref", + "match.metric", + "match.metric_type", + "match.route_type", + "match.routerid", + "match.source_protocol", + "match.tag", + ] + w_match = want.pop("match", {}) + h_match = have.pop("match", {}) + for k, v in iteritems(w_match): + if k in ["ip", "ipv6"]: + for k_ip, v_ip in iteritems(v): + if h_match.get(k): + h = {k_ip: h_match[k].pop(k_ip, {})} + else: + h = {} + self.compare( + parsers=[ + "match.ip", + "match.ipaddress", + "match.ipv6address", + "match.ipv6", + ], + want={"entries": {"match": {k: {k_ip: v_ip}}}}, + have={"entries": {"match": {k: h}}}, + ) + h_match.pop(k, {}) + continue + self.compare( + parsers=parsers, + want={"entries": {"match": {k: v}}}, + have={"entries": {"match": {k: h_match.pop(k, {})}}}, + ) + for k, v in iteritems(h_match): + if k in ["ip", "ipv6"]: + for hk, hv in iteritems(v): + self.compare( + parsers=[ + "match.ip", + "match.ipaddress", + "match.ipv6address", + "match.ipv6", + ], + want={}, + have={"entries": {"match": {k: {hk: hv}}}}, + ) + continue + self.compare( + parsers=parsers, + want={}, + have={"entries": {"match": {k: v}}}, + ) + + def _comapre_set(self, want, have): + parsers = [ + "set.as_path.prepend", + "set.as_path.match", + "set.bgp", + "set.community.graceful_shutdown", + "set.community.none", + "set.community.number", + "set.community.list", + "set.community.internet", + "set.distance", + "set.evpn", + "set.extcommunity.lbw", + "set.extcommunity.none", + "set.extcommunity.rt", + "set.extcommunity.soo", + "set.ip", + "set.ipv6", + "set.isis", + "set.local_pref", + "set.metric.value", + "set.metric_type", + "set.nexthop", + "set.origin", + "set.segment_index", + "set.tag", + "set.weight", + ] + + w_set = want.pop("set", {}) + h_set = have.pop("set", {}) + for k, v in iteritems(w_set): + self.compare( + parsers=parsers, + want={"entries": {"set": {k: v}}}, + have={"entries": {"set": {k: h_set.pop(k, {})}}}, + ) + for k, v in iteritems(h_set): + self.compare( + parsers=parsers, + want={}, + have={"entries": {"set": {k: v}}}, + ) + + def _route_maps_list_to_dict(self, entry): + for name, r_map in iteritems(entry): + if r_map.get("entries"): + map_dict = {} + for entry in r_map["entries"]: + if entry.get("sequence"): + seq = entry["sequence"] + else: + seq = "seq" + mapkey = name + " " + str(seq) + map_dict.update({mapkey: entry}) + r_map["entries"] = map_dict diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/snmp_server/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/snmp_server/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/snmp_server/snmp_server.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/snmp_server/snmp_server.py new file mode 100644 index 000000000..7d850fea2 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/snmp_server/snmp_server.py @@ -0,0 +1,243 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos_snmp_server config file. +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to its desired end-state is +created. +""" + +import re + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( + ResourceModule, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_merge, + get_from_dict, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.snmp_server import ( + Snmp_serverTemplate, +) + + +class Snmp_server(ResourceModule): + """ + The eos_snmp_server config class + """ + + def __init__(self, module): + super(Snmp_server, self).__init__( + empty_fact_val={}, + facts_module=Facts(module), + module=module, + resource="snmp_server", + tmplt=Snmp_serverTemplate(), + ) + self.parsers = [ + "chassis_id", + "contact", + "traps.bgp", + "traps.bridge", + "traps.capacity", + "traps.entity", + "traps.external_alarm", + "traps.isis", + "traps.lldp", + "traps.mpls_ldp", + "traps.msdp", + "traps.ospf", + "traps.ospfv3", + "traps.pim", + "traps.snmp", + "traps.snmpConfigManEvent", + "traps.switchover", + "traps.test", + "traps.vrrp", + "engineid", + "extension", + "local_interface", + "location", + "notification", + "objects.mac", + "objects.route", + "qos", + "qosmib", + "transmit", + "transport", + ] + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + if self.state not in ["parsed", "gathered"]: + self.generate_commands() + self.run_commands() + return self.result + + def generate_commands(self): + """Generate configuration commands to send based on + want, have and desired state. + """ + + wantd = {"snmp_server": self.want} + haved = {"snmp_server": self.have} + + # turn all lists of dicts into dicts prior to merge + for entry in wantd["snmp_server"], haved["snmp_server"]: + self._snmp_server_list_to_dict(entry) + + # if state is merged, merge want onto have and then compare + if self.state == "merged": + wantd = dict_merge(haved, wantd) + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + haved = { + k: v for k, v in iteritems(haved) if k in wantd or not wantd + } + wantd = {} + + # if state is deleted, empty out wantd and set haved to wantd + if self.state == "deleted": + wantd = {} + for k, have in iteritems(haved): + self._compare(want={}, have=have) + + for k, want in iteritems(wantd): + self._compare(want=want, have=haved.pop(k, {})) + + def _compare(self, want, have): + """Leverages the base class `compare()` method and + populates the list of commands to be run by comparing + the `want` and `have` data with the `parsers` defined + for the Snmp_server network resource. + """ + self._compare_hosts(want, have) + self._compare_lists(want, have) + for name, entry in iteritems(want): + self.compare( + parsers=self.parsers, + want={name: entry}, + have={name: have.pop(name, {})}, + ) + for name, entry in iteritems(have): + self.compare(parsers=self.parsers, want={}, have={name: entry}) + + self._modify_traps_negate() + + def _modify_traps_negate(self): + command_set = [] + for cmd in self.commands: + if re.search("no snmp-server enable traps", cmd): + command_set.append(cmd.replace("no ", "default ")) + else: + command_set.append(cmd) + self.commands = command_set + + def _compare_lists(self, want, have): + parsers = [ + "communities_ipv6_acl", + "communities_ipv4_acl", + "groups", + "acls", + "views", + "users.auth", + "users.localized", + "vrfs", + ] + for attrib in [ + "communities", + "groups", + "acls", + "users", + "views", + "vrfs", + ]: + wdict = get_from_dict(want, attrib) or {} + hdict = get_from_dict(have, attrib) or {} + for key, entry in iteritems(wdict): + # self.addcmd(entry, attrib, False) + self.compare( + parsers=parsers, + want={attrib: entry}, + have={attrib: hdict.pop(key, {})}, + ) + # remove remaining items in have for replaced + for entry in hdict.values(): + self.compare(parsers=parsers, want={}, have={attrib: entry}) + + def _compare_hosts(self, want, have): + wdict = get_from_dict(want, "hosts") or {} + hdict = get_from_dict(have, "hosts") or {} + for key, entry in iteritems(wdict): + # self.addcmd(entry, attrib, False) + self.compare( + parsers="hosts", + want={"hosts": {key: entry}}, + have={"hosts": {key: hdict.pop(key, {})}}, + ) + # remove remaining items in have for replaced + for key, entry in iteritems(hdict): + self.compare( + parsers="hosts", + want={}, + have={"hosts": {key: entry}}, + ) + + def _snmp_server_list_to_dict(self, entry): + param_dict = { + "communities": "name", + "groups": "group", + "acls": "afi", + "users": "user", + "views": "view", + "vrfs": "vrf", + } + for k, v in iteritems(param_dict): + if k in entry: + a_dict = {} + for el in entry[k]: + a_dict.update({el[v]: el}) + entry[k] = a_dict + if "hosts" in entry: + host_dict = {} + for el in entry["hosts"]: + tr = "" + inf = "" + if el.get("traps"): + tr = "traps" + if el.get("informs"): + inf = "informs" + host_dict.update( + { + ( + el.get("host"), + el.get("user"), + el.get("version"), + inf, + tr, + el.get("udp_port"), + ): el, + }, + ) + entry["hosts"] = host_dict diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/static_routes/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/static_routes/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/static_routes/static_routes.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/static_routes/static_routes.py new file mode 100644 index 000000000..0c4198edf --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/static_routes/static_routes.py @@ -0,0 +1,369 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_static_routes class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + remove_empties, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) + + +class Static_routes(ConfigBase): + """ + The eos_static_routes class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["static_routes"] + + def __init__(self, module): + super(Static_routes, self).__init__(module) + + def get_static_routes_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + static_routes_facts = facts["ansible_network_resources"].get( + "static_routes", + ) + if not static_routes_facts: + return [] + return static_routes_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + if self.state in self.ACTION_STATES: + existing_static_routes_facts = self.get_static_routes_facts() + else: + existing_static_routes_facts = [] + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_static_routes_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_static_routes_facts = self.get_static_routes_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + if not self._module.params["running_config"]: + self._module.fail_json( + msg="Value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_static_routes_facts( + data=self._module.params["running_config"], + ) + else: + changed_static_routes_facts = [] + + if self.state in self.ACTION_STATES: + result["before"] = existing_static_routes_facts + if result["changed"]: + result["after"] = changed_static_routes_facts + elif self.state == "gathered": + result["gathered"] = changed_static_routes_facts + + result["warnings"] = warnings + return result + + def set_config(self, existing_static_routes_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + onbox_configs = [] + for h in existing_static_routes_facts: + return_command = add_commands(h) + for command in return_command: + onbox_configs.append(command) + config = self._module.params.get("config") + want = [] + if config: + for w in config: + want.append(remove_empties(w)) + have = existing_static_routes_facts + resp = self.set_state(want, have) + for want_config in resp: + if want_config not in onbox_configs: + commands.append(want_config) + return commands + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + if self.state in ("merged", "replaced", "overridden") and not want: + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + self.state, + ), + ) + state = self._module.params["state"] + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or self.state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + haveconfigs = [] + vrf = get_vrf(want) + dest = get_dest(want) + for h in have: + return_command = add_commands(h) + for command in return_command: + for d in dest: + if d in command: + if vrf is None: + if "vrf" not in command: + haveconfigs.append(command) + else: + if vrf in command: + haveconfigs.append(command) + wantconfigs = set_commands(want, have) + + removeconfigs = list(set(haveconfigs) - set(wantconfigs)) + for command in removeconfigs: + commands.append("no " + command) + for wantcmd in wantconfigs: + commands.append(wantcmd) + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + haveconfigs = [] + for h in have: + return_command = add_commands(h) + for command in return_command: + haveconfigs.append(command) + wantconfigs = set_commands(want, have) + idempotentconfigs = list(set(haveconfigs) - set(wantconfigs)) + if not idempotentconfigs: + return idempotentconfigs + removeconfigs = list(set(haveconfigs) - set(wantconfigs)) + for command in removeconfigs: + commands.append("no " + command) + for wantcmd in wantconfigs: + commands.append(wantcmd) + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + return set_commands(want, have) + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + if not want: + for h in have: + return_command = add_commands(h) + for command in return_command: + command = "no " + command + commands.append(command) + else: + for w in want: + return_command = del_commands(w, have) + for command in return_command: + commands.append(command) + return commands + + +def set_commands(want, have): + commands = [] + for w in want: + return_command = add_commands(w) + for command in return_command: + commands.append(command) + return commands + + +def add_commands(want): + commandset = [] + if not want: + return commandset + vrf = ( + want["vrf"] + if "vrf" in want.keys() and want["vrf"] is not None + else None + ) + for address_family in want["address_families"]: + for route in address_family["routes"]: + for next_hop in route["next_hops"]: + commands = [] + if address_family["afi"] == "ipv4": + commands.append("ip route") + else: + commands.append("ipv6 route") + if vrf: + commands.append(" vrf " + vrf) + if not re.search(r"/", route["dest"]): + mask = route["dest"].split()[1] + cidr = get_net_size(mask) + commands.append( + " " + route["dest"].split()[0] + "/" + cidr, + ) + else: + commands.append(" " + route["dest"]) + if "interface" in next_hop.keys(): + commands.append(" " + next_hop["interface"]) + if "nexthop_grp" in next_hop.keys(): + commands.append( + " Nexthop-Group" + " " + next_hop["nexthop_grp"], + ) + if "forward_router_address" in next_hop.keys(): + commands.append(" " + next_hop["forward_router_address"]) + if "mpls_label" in next_hop.keys(): + commands.append(" label " + str(next_hop["mpls_label"])) + if "track" in next_hop.keys(): + commands.append(" track " + next_hop["track"]) + if "admin_distance" in next_hop.keys(): + commands.append(" " + str(next_hop["admin_distance"])) + if "description" in next_hop.keys(): + commands.append(" name " + str(next_hop["description"])) + if "tag" in next_hop.keys(): + commands.append(" tag " + str(next_hop["tag"])) + + config_commands = "".join(commands) + commandset.append(config_commands) + return commandset + + +def del_commands(want, have): + commandset = [] + haveconfigs = [] + for h in have: + return_command = add_commands(h) + for command in return_command: + command = "no " + command + haveconfigs.append(command) + if want is None or "address_families" not in want.keys(): + commandset = haveconfigs + if "address_families" not in want.keys() and "vrf" in want.keys(): + commandset = [] + for command in haveconfigs: + if want["vrf"] in command: + commandset.append(command) + elif ( + want is not None + and "vrf" not in want.keys() + and "address_families" not in want.keys() + ): + commandset = [] + for command in haveconfigs: + if "vrf" not in command: + commandset.append(command) + + elif want["address_families"]: + for address_family in want["address_families"]: + for command in haveconfigs: + afi = "ip " if address_family["afi"] == "ipv4" else "ipv6" + if afi in command: + commandset.append(command) + return commandset + + +def get_net_size(netmask): + binary_str = "" + netmask = netmask.split(".") + for octet in netmask: + binary_str += bin(int(octet))[2:].zfill(8) + return str(len(binary_str.rstrip("0"))) + + +def get_vrf(config): + vrf = "" + for c in config: + vrf = c["vrf"] if "vrf" in c.keys() and c["vrf"] else None + return vrf + + +def get_dest(config): + dest = [] + for c in config: + for address_family in c["address_families"]: + for route in address_family["routes"]: + dest.append(route["dest"]) + return dest diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/vlans/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/vlans/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/vlans/vlans.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/vlans/vlans.py new file mode 100644 index 000000000..664216e6d --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/config/vlans/vlans.py @@ -0,0 +1,262 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos_vlans class +It is in this file where the current configuration (as dict) +is compared to the provided configuration (as dict) and the command set +necessary to bring the current configuration to it's desired end-state is +created +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import ( + ConfigBase, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + dict_diff, + param_list_to_dict, + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.facts import ( + Facts, +) + + +class Vlans(ConfigBase): + """ + The eos_vlans class + """ + + gather_subset = ["!all", "!min"] + + gather_network_resources = ["vlans"] + + def get_vlans_facts(self, data=None): + """Get the 'facts' (the current configuration) + + :rtype: A dictionary + :returns: The current configuration as a dictionary + """ + facts, _warnings = Facts(self._module).get_facts( + self.gather_subset, + self.gather_network_resources, + data=data, + ) + vlans_facts = facts["ansible_network_resources"].get("vlans") + if not vlans_facts: + return [] + return vlans_facts + + def execute_module(self): + """Execute the module + + :rtype: A dictionary + :returns: The result from module execution + """ + result = {"changed": False} + warnings = list() + commands = list() + + if self.state in self.ACTION_STATES: + existing_vlans_facts = self.get_vlans_facts() + else: + existing_vlans_facts = {} + + if self.state in self.ACTION_STATES or self.state == "rendered": + commands.extend(self.set_config(existing_vlans_facts)) + + if commands and self.state in self.ACTION_STATES: + if not self._module.check_mode: + self._connection.edit_config(commands) + result["changed"] = True + if self.state in self.ACTION_STATES: + result["commands"] = commands + + if self.state in self.ACTION_STATES or self.state == "gathered": + changed_vlans_facts = self.get_vlans_facts() + elif self.state == "rendered": + result["rendered"] = commands + elif self.state == "parsed": + running_config = self._module.params["running_config"] + if not running_config: + self._module.fail_json( + msg="value of running_config parameter must not be empty for state parsed", + ) + result["parsed"] = self.get_vlans_facts(data=running_config) + + if self.state in self.ACTION_STATES: + result["before"] = existing_vlans_facts + if result["changed"]: + result["after"] = changed_vlans_facts + elif self.state == "gathered": + result["gathered"] = changed_vlans_facts + result["warnings"] = warnings + return result + + def set_config(self, existing_vlans_facts): + """Collect the configuration from the args passed to the module, + collect the current configuration (as a dict from facts) + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + want = self._module.params["config"] + have = existing_vlans_facts + resp = self.set_state(want, have) + return to_list(resp) + + def set_state(self, want, have): + """Select the appropriate function based on the state provided + + :param want: the desired configuration as a dictionary + :param have: the current configuration as a dictionary + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + state = self._module.params["state"] + if ( + state in ("merged", "replaced", "overridden", "rendered") + and not want + ): + self._module.fail_json( + msg="value of config parameter must not be empty for state {0}".format( + state, + ), + ) + want = param_list_to_dict(want, "vlan_id", remove_key=False) + have = param_list_to_dict(have, "vlan_id", remove_key=False) + if state == "overridden": + commands = self._state_overridden(want, have) + elif state == "deleted": + commands = self._state_deleted(want, have) + elif state == "merged" or state == "rendered": + commands = self._state_merged(want, have) + elif state == "replaced": + commands = self._state_replaced(want, have) + return commands + + @staticmethod + def _state_replaced(want, have): + """The command generator when state is replaced + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for vlan_id, desired in want.items(): + if vlan_id in have: + extant = have[vlan_id] + else: + extant = dict() + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(vlan_id, add_config, del_config)) + + return commands + + @staticmethod + def _state_overridden(want, have): + """The command generator when state is overridden + + :rtype: A list + :returns: the commands necessary to migrate the current configuration + to the desired configuration + """ + commands = [] + for vlan_id, extant in have.items(): + if vlan_id in want: + desired = want[vlan_id] + else: + desired = dict() + + add_config = dict_diff(extant, desired) + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(vlan_id, add_config, del_config)) + + # Handle vlans not already in config + new_vlans = [vlan_id for vlan_id in want if vlan_id not in have] + for vlan_id in new_vlans: + desired = want[vlan_id] + extant = dict(vlan_id=vlan_id) + add_config = dict_diff(extant, desired) + + commands.extend(generate_commands(vlan_id, add_config, {})) + + return commands + + @staticmethod + def _state_merged(want, have): + """The command generator when state is merged + + :rtype: A list + :returns: the commands necessary to merge the provided into + the current configuration + """ + commands = [] + for vlan_id, desired in want.items(): + if vlan_id in have: + extant = have[vlan_id] + else: + extant = dict() + + add_config = dict_diff(extant, desired) + + commands.extend(generate_commands(vlan_id, add_config, {})) + + return commands + + @staticmethod + def _state_deleted(want, have): + """The command generator when state is deleted + + :rtype: A list + :returns: the commands necessary to remove the current configuration + of the provided objects + """ + commands = [] + for vlan_id in want: + desired = dict() + if vlan_id in have: + extant = have[vlan_id] + else: + continue + + del_config = dict_diff(desired, extant) + + commands.extend(generate_commands(vlan_id, {}, del_config)) + + return commands + + +def generate_commands(vlan_id, to_set, to_remove): + commands = [] + if "vlan_id" in to_remove: + return ["no vlan {0}".format(vlan_id)] + + for key in to_remove: + if key in to_set.keys(): + continue + commands.append("no {0}".format(key)) + + for key, value in to_set.items(): + if key == "vlan_id" or value is None: + continue + + commands.append("{0} {1}".format(key, value)) + + if commands: + commands.insert(0, "vlan {0}".format(vlan_id)) + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/eos.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/eos.py new file mode 100644 index 000000000..292ad274f --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/eos.py @@ -0,0 +1,568 @@ +# +# This code is part of Ansible, but is an independent component. +# +# This particular file snippet, and this file snippet only, is BSD licensed. +# Modules you write using this snippet, which is embedded dynamically by Ansible +# still belong to the author of the module, and may assign their own license +# to the complete work. +# +# (c) 2017 Red Hat, Inc. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type +import json +import os +import time + +from ansible.module_utils._text import to_text +from ansible.module_utils.connection import Connection, ConnectionError +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + NetworkConfig, + dumps, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + ComplexList, + to_list, +) + + +_DEVICE_CONNECTION = None + + +def get_connection(module): + global _DEVICE_CONNECTION + if not _DEVICE_CONNECTION: + connection_proxy = Connection(module._socket_path) + cap = json.loads(connection_proxy.get_capabilities()) + if cap["network_api"] == "cliconf": + conn = Cli(module) + elif cap["network_api"] == "eapi": + conn = HttpApi(module) + _DEVICE_CONNECTION = conn + return _DEVICE_CONNECTION + + +def transform_commands(module): + transform = ComplexList( + dict( + command=dict(key=True), + output=dict(), + prompt=dict(type="list"), + answer=dict(type="list"), + newline=dict(type="bool", default=True), + sendonly=dict(type="bool", default=False), + check_all=dict(type="bool", default=False), + version=dict( + type="str", + default="latest", + choices=["latest", "1"], + ), + ), + module, + ) + + return transform(module.params["commands"]) + + +def session_name(): + """Generate a unique string to be used as a configuration session name.""" + return "ansible_%d" % (time.time() * 100) + + +class Cli: + def __init__(self, module): + self._module = module + self._device_configs = {} + self._session_support = None + self._connection = None + + @property + def supports_sessions(self): + if self._session_support is None: + self._session_support = self._get_connection().supports_sessions() + return self._session_support + + def _get_connection(self): + if self._connection: + return self._connection + self._connection = Connection(self._module._socket_path) + + return self._connection + + def get_config(self, flags=None): + """Retrieves the current config from the device or cache""" + flags = [] if flags is None else flags + + cmd = "show running-config " + cmd += " ".join(flags) + cmd = cmd.strip() + + try: + return self._device_configs[cmd] + except KeyError: + conn = self._get_connection() + try: + out = conn.get_config(flags=flags) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace"), + ) + + cfg = to_text(out, errors="surrogate_then_replace").strip() + self._device_configs[cmd] = cfg + return cfg + + def run_commands(self, commands, check_rc=True): + """Run list of commands on remote device and return results""" + connection = self._get_connection() + try: + response = connection.run_commands( + commands=commands, + check_rc=check_rc, + ) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace"), + ) + return response + + def get_session_config(self, commands, commit=False, replace=False): + """Loads the config commands onto the remote device""" + conn = self._get_connection() + try: + response = conn.get_session_config(commands, commit, replace) + except ConnectionError as exc: + message = getattr(exc, "err", to_text(exc)) + if ( + "check mode is not supported without configuration session" + in message + ): + self._module.warn( + "EOS can not check config without config session", + ) + response = {"changed": True} + else: + self._module.fail_json( + msg="%s" % message, + data=to_text(message, errors="surrogate_then_replace"), + ) + + return response + + def load_config(self, commands, commit=False, replace=False): + """Loads the config commands onto the remote device""" + conn = self._get_connection() + try: + response = conn.edit_config(commands, commit, replace) + except ConnectionError as exc: + message = getattr(exc, "err", to_text(exc)) + if ( + "check mode is not supported without configuration session" + in message + ): + self._module.warn( + "EOS can not check config without config session", + ) + response = {"changed": True} + else: + self._module.fail_json( + msg="%s" % message, + data=to_text(message, errors="surrogate_then_replace"), + ) + + return response + + def get_diff( + self, + candidate=None, + running=None, + diff_match="line", + diff_ignore_lines=None, + path=None, + diff_replace="line", + ): + conn = self._get_connection() + try: + diff = conn.get_diff( + candidate=candidate, + running=running, + diff_match=diff_match, + diff_ignore_lines=diff_ignore_lines, + path=path, + diff_replace=diff_replace, + ) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace"), + ) + return diff + + def get_capabilities(self): + """Returns platform info of the remove device""" + if hasattr(self._module, "_capabilities"): + return self._module._capabilities + + connection = self._get_connection() + try: + capabilities = connection.get_capabilities() + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace"), + ) + self._module._capabilities = json.loads(capabilities) + return self._module._capabilities + + +class HttpApi: + def __init__(self, module): + self._module = module + self._device_configs = {} + self._session_support = None + self._connection_obj = None + + @property + def _connection(self): + if not self._connection_obj: + self._connection_obj = Connection(self._module._socket_path) + + return self._connection_obj + + @property + def supports_sessions(self): + if self._session_support is None: + self._session_support = self._connection.supports_sessions() + return self._session_support + + def run_commands(self, commands, check_rc=True): + """Runs list of commands on remote device and returns results""" + output = None + queue = list() + responses = list() + + def run_queue(queue, output, version): + try: + response = to_list( + self._connection.send_request( + queue, + output=output, + version=version, + ), + ) + except ConnectionError as exc: + if check_rc: + raise + return to_list(to_text(exc)) + + if output == "json": + response = [json.loads(item) for item in response] + return response + + for item in to_list(commands): + cmd_output = "text" + if isinstance(item, dict): + command = item["command"] + if "output" in item: + cmd_output = item["output"] + if "version" in item: + version = item["version"] + else: + command = item + + # Emulate '| json' from CLI + if is_json(command): + command = command.rsplit("|", 1)[0] + cmd_output = "json" + + if output and output != cmd_output: + responses.extend(run_queue(queue, output, version)) + queue = list() + + output = cmd_output + queue.append(command) + + if queue: + responses.extend(run_queue(queue, output, version)) + + return responses + + def get_config(self, flags=None): + """Retrieves the current config from the device or cache""" + flags = [] if flags is None else flags + + cmd = "show running-config " + cmd += " ".join(flags) + cmd = cmd.strip() + + try: + return self._device_configs[cmd] + except KeyError: + try: + out = self._connection.send_request(cmd) + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace"), + ) + + cfg = to_text(out).strip() + self._device_configs[cmd] = cfg + return cfg + + def get_diff( + self, + candidate=None, + running=None, + diff_match="line", + diff_ignore_lines=None, + path=None, + diff_replace="line", + ): + diff = {} + + # prepare candidate configuration + candidate_obj = NetworkConfig(indent=3) + candidate_obj.load(candidate) + + if running and diff_match != "none" and diff_replace != "config": + # running configuration + running_obj = NetworkConfig( + indent=3, + contents=running, + ignore_lines=diff_ignore_lines, + ) + configdiffobjs = candidate_obj.difference( + running_obj, + path=path, + match=diff_match, + replace=diff_replace, + ) + + else: + configdiffobjs = candidate_obj.items + + diff["config_diff"] = ( + dumps(configdiffobjs, "commands") if configdiffobjs else {} + ) + return diff + + def load_config(self, config, commit=False, replace=False): + """Loads the configuration onto the remote devices + + If the device doesn't support configuration sessions, this will + fallback to using configure() to load the commands. If that happens, + there will be no returned diff or session values + """ + return self.edit_config(config, commit, replace) + + def edit_config(self, config, commit=False, replace=False): + """Loads the configuration onto the remote devices + + If the device doesn't support configuration sessions, this will + fallback to using configure() to load the commands. If that happens, + there will be no returned diff or session values + """ + session = session_name() + result = {"session": session} + banner_cmd = None + banner_input = [] + + commands = ["configure session %s" % session] + if replace: + commands.append("rollback clean-config") + + for command in config: + if command.startswith("banner"): + banner_cmd = command + banner_input = [] + elif banner_cmd: + if command == "EOF": + command = { + "cmd": banner_cmd, + "input": "\n".join(banner_input), + } + banner_cmd = None + commands.append(command) + else: + banner_input.append(command) + continue + else: + commands.append(command) + + try: + response = self._connection.send_request(commands) + except Exception: + commands = ["configure session %s" % session, "abort"] + response = self._connection.send_request(commands, output="text") + raise + + commands = [ + "configure session %s" % session, + "show session-config diffs", + ] + if commit: + commands.append("commit") + else: + commands.append("abort") + + response = self._connection.send_request(commands, output="text") + diff = response[1].strip() + if diff: + result["diff"] = diff + + return result + + def get_session_config(self, config, commit=False, replace=False): + """Loads the configuration onto the remote devices + + If the device doesn't support configuration sessions, this will + fallback to using configure() to load the commands. If that happens, + there will be no returned diff or session values + """ + resp = "" + use_session = os.getenv("ANSIBLE_EOS_USE_SESSIONS", True) + try: + use_session = int(use_session) + except ValueError: + pass + + if not all((bool(use_session), self.supports_sessions)): + if commit: + return self.configure(config) + else: + self._module.warn( + "EOS can not check config without config session", + ) + result = {"changed": True} + return result + session = session_name() + result = {"session": session} + commands = ["configure session %s" % session] + + if replace: + commands.append("rollback clean-config") + + commands.extend(config) + response = self._connection.send_request(commands) + if "error" in response: + commands = ["configure session %s" % session, "abort"] + self._connection.send_request(commands) + err = response["error"] + error_text = [] + for data in err["data"]: + error_text.extend(data.get("errors", [])) + error_text = "\n".join(error_text) or err["message"] + self._module.fail_json(msg=error_text, code=err["code"]) + + commands = [ + "configure session %s" % session, + "show session-config", + ] + if commit: + commands.append("commit") + else: + commands.append("abort") + response = self._connection.send_request(commands, output="text") + for out in response: + if out: + resp += out + "" + return resp.rstrip() + + def get_capabilities(self): + """Returns platform info of the remove device""" + try: + capabilities = self._connection.get_capabilities() + except ConnectionError as exc: + self._module.fail_json( + msg=to_text(exc, errors="surrogate_then_replace"), + ) + + return json.loads(capabilities) + + +def is_json(cmd): + return to_text(cmd, errors="surrogate_then_replace").endswith("| json") + + +def to_command(module, commands): + transform = ComplexList( + dict( + command=dict(key=True), + output=dict(type="str", default="text"), + prompt=dict(type="list"), + answer=dict(type="list"), + newline=dict(type="bool", default=True), + sendonly=dict(type="bool", default=False), + check_all=dict(type="bool", default=False), + version=dict(type="str", default="latest"), + ), + module, + ) + + return transform(to_list(commands)) + + +def get_config(module, flags=None): + flags = None if flags is None else flags + + conn = get_connection(module) + return conn.get_config(flags) + + +def run_commands(module, commands, check_rc=True): + conn = get_connection(module) + return conn.run_commands(to_command(module, commands), check_rc=check_rc) + + +def load_config(module, config, commit=False, replace=False): + conn = get_connection(module) + return conn.load_config(config, commit, replace) + + +def get_session_config(module, config, commit=False, replace=False): + conn = get_connection(module) + return conn.get_session_config(config, commit, replace) + + +def get_diff( + self, + candidate=None, + running=None, + diff_match="line", + diff_ignore_lines=None, + path=None, + diff_replace="line", +): + conn = self.get_connection() + return conn.get_diff( + candidate=candidate, + running=running, + diff_match=diff_match, + diff_ignore_lines=diff_ignore_lines, + path=path, + diff_replace=diff_replace, + ) + + +def get_capabilities(module): + conn = get_connection(module) + return conn.get_capabilities() diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acl_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acl_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acl_interfaces/acl_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acl_interfaces/acl_interfaces.py new file mode 100644 index 000000000..2e53931de --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acl_interfaces/acl_interfaces.py @@ -0,0 +1,149 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos acl_interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.acl_interfaces.acl_interfaces import ( + Acl_interfacesArgs, +) + + +class Acl_interfacesFacts(object): + """The eos acl_interfaces fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Acl_interfacesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get( + "show running-config | include interface | access-group | traffic-filter", + ) + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for acl_interfaces + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + + if not data: + data = self.get_device_data(connection) + # split the config into instances of the resource + resource_delim = "interface" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + objs = [] + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("acl_interfaces", None) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["acl_interfaces"] = [ + utils.remove_empties(cfg) for cfg in params["config"] + ] + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + access_group_list = [] + access_group_v6_list = [] + acls_list = [] + group_list = [] + group_dict = {} + config["name"] = utils.parse_conf_arg(conf, "^interface") + conf_lines = conf.split("\n") + for line in conf_lines: + if config["name"] in line: + continue + access_group = utils.parse_conf_arg(line, "^ip access-group") + # This module was verified on an ios device since vEOS doesnot support + # acl_interfaces cnfiguration. In ios, ipv6 acl is configured as + # traffic-filter and in eos it is access-group + + # access_group_v6 = utils.parse_conf_arg(line, 'ipv6 traffic-filter') + access_group_v6 = utils.parse_conf_arg(line, "^ipv6 access-group") + if access_group: + access_group_list.append(access_group) + if access_group_v6: + access_group_v6_list.append(access_group_v6) + if access_group_list: + for acl in access_group_list: + a_name = acl.split()[0] + a_dir = acl.split()[1] + acls_dict = {"name": a_name, "direction": a_dir} + acls_list.append(acls_dict) + group_dict = {"afi": "ipv4", "acls": acls_list} + group_list.append(group_dict) + acls_list = [] + if group_list: + config["access_groups"] = group_list + if access_group_v6_list: + for acl in access_group_v6_list: + a_name = acl.split()[0] + a_dir = acl.split()[1] + acls_dict = {"name": a_name, "direction": a_dir} + acls_list.append(acls_dict) + group_dict = {"acls": acls_list, "afi": "ipv6"} + group_list.append(group_dict) + acls_list = [] + if group_list: + config["access_groups"] = group_list + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acls/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acls/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acls/acls.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acls/acls.py new file mode 100644 index 000000000..567fca8ba --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/acls/acls.py @@ -0,0 +1,392 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos acls fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.acls.acls import ( + AclsArgs, +) + + +class AclsFacts(object): + """The eos acls fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = AclsArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section access-list") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for acls + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # split the config into instances of the resource + find_pattern = r"(?:^|\n)(?:ip|ipv6) access\-list.*?(?=(?:^|\n)(?:ip|ipv6) access\-list|$)" + resources = [] + for p in re.findall(find_pattern, data, re.DOTALL): + resources.append(p) + + objs = [] + ipv4list = [] + ipv6list = [] + for resource in resources: + if "ipv6" in resource: + ipv6list.append(resource) + else: + ipv4list.append(resource) + ipv4list = ["\n".join(ipv4list)] + ipv6list = ["\n".join(ipv6list)] + for resource in ipv4list: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.append(obj) + for resource in ipv6list: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("acls", None) + facts = {} + if objs: + facts["acls"] = [] + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + for cfg in params["config"]: + facts["acls"].append(utils.remove_empties(cfg)) + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + afi_list = [] + acls_list = [] + name_dict = {} + standard = 0 + operator = ["eq", "lt", "neq", "range", "gt"] + flags = ["ack", "established", "fin", "psh", "rst", "syn", "urg"] + others = ["hop_limit", "log", "ttl", "fragments", "tracked"] + for dev_config in conf.split("\n"): + ace_dict = {} + if not dev_config: + continue + if dev_config == "!": + continue + dev_config = dev_config.strip() + matches = re.findall(r"(ip.*?) access-list (.*)", dev_config) + if matches: + afi = "ipv4" if matches[0][0] == "ip" else "ipv6" + ace_list = [] + if bool(name_dict): + acls_list.append(name_dict.copy()) + name_dict = {} + if afi not in afi_list: + afi_list.append(afi) + config.update({"afi": afi}) + if "standard" in matches[0][1]: + standard = 1 + name = matches[0][1].split() + name_dict.update({"name": name[1]}) + name_dict.update({"standard": True}) + else: + name_dict.update({"name": matches[0][1]}) + else: + source_dict = {} + dest_dict = {} + dev_config = re.sub("-", "_", dev_config) + dev_config_remainder = dev_config.split() + if "fragment_rules" in dev_config: + ace_dict.update({"sequence": dev_config_remainder.pop(0)}) + ace_dict.update({"fragment_rules": True}) + if "remark" in dev_config: + ace_dict.update({"sequence": dev_config_remainder.pop(0)}) + ace_dict.update( + {"remark": " ".join(dev_config_remainder[1:])}, + ) + seq = re.search(r"\d+ (permit|deny) .*", dev_config) + if seq: + ace_dict.update({"sequence": dev_config_remainder.pop(0)}) + ace_dict.update({"grant": dev_config_remainder.pop(0)}) + if ( + dev_config_remainder + and dev_config_remainder[0] == "vlan" + ): + vlan_str = "" + dev_config_remainder.pop(0) + if ( + dev_config_remainder + and dev_config_remainder[0] == "inner" + ): + vlan_str = dev_config_remainder.pop(0) + " " + vlan_str = ( + dev_config_remainder.pop(0) + + " " + + dev_config_remainder.pop(0) + ) + ace_dict.update({"vlan": vlan_str}) + if not standard: + protocol = dev_config_remainder[0] + ace_dict.update( + {"protocol": dev_config_remainder.pop(0)}, + ) + src_prefix = re.search(r"/", dev_config_remainder[0]) + src_address = re.search( + r"[a-z\d:\.]+", + dev_config_remainder[0], + ) + if ( + dev_config_remainder + and dev_config_remainder[0] == "host" + ): + source_dict.update( + {"host": dev_config_remainder.pop(1)}, + ) + dev_config_remainder.pop(0) + elif ( + dev_config_remainder + and dev_config_remainder[0] == "any" + ): + source_dict.update({"any": True}) + dev_config_remainder.pop(0) + elif src_prefix: + source_dict.update( + {"subnet_address": dev_config_remainder.pop(0)}, + ) + elif src_address: + source_dict.update( + {"address": dev_config_remainder.pop(0)}, + ) + source_dict.update( + {"wildcard_bits": dev_config_remainder.pop(0)}, + ) + if dev_config_remainder: + if ( + dev_config_remainder + and dev_config_remainder[0] in operator + ): + port_dict = {} + src_port = "" + src_opr = dev_config_remainder.pop(0) + portlist = dev_config_remainder[:] + for config_remainder in portlist: + addr = re.search(r"[\.\:]", config_remainder) + if ( + config_remainder == "any" + or config_remainder == "host" + or addr + ): + break + src_port = src_port + " " + config_remainder + dev_config_remainder.pop(0) + src_port = src_port.strip() + port_dict.update({src_opr: src_port}) + source_dict.update({"port_protocol": port_dict}) + ace_dict.update({"source": source_dict}) + if not dev_config_remainder or standard: + if ( + dev_config_remainder + and "log" in dev_config_remainder + ): + ace_dict.update({"log": True}) + if bool(ace_dict): + ace_list.append(ace_dict.copy()) + if len(ace_list): + name_dict = name_dict.copy() + name_dict.update({"aces": ace_list[:]}) + # acls_list.append(name_dict) + continue + dest_prefix = re.search(r"/", dev_config_remainder[0]) + dest_address = re.search( + r"[a-z\d:\.]+", + dev_config_remainder[0], + ) + if ( + dev_config_remainder + and dev_config_remainder[0] == "host" + ): + dest_dict.update({"host": dev_config_remainder.pop(1)}) + dev_config_remainder.pop(0) + elif ( + dev_config_remainder + and dev_config_remainder[0] == "any" + ): + dest_dict.update({"any": True}) + dev_config_remainder.pop(0) + elif dest_prefix: + dest_dict.update( + {"subnet_address": dev_config_remainder.pop(0)}, + ) + elif dest_address: + dest_dict.update( + {"address": dev_config_remainder.pop(0)}, + ) + dest_dict.update( + {"wildcard_bits": dev_config_remainder.pop(0)}, + ) + if dev_config_remainder: + if dev_config_remainder[0] in operator: + port_dict = {} + dest_port = "" + dest_opr = dev_config_remainder.pop(0) + portlist = dev_config_remainder[:] + for config_remainder in portlist: + if ( + config_remainder in operator + or config_remainder in others + ): + break + dest_port = dest_port + " " + config_remainder + dev_config_remainder.pop(0) + dest_port = dest_port.strip() + port_dict.update({dest_opr: dest_port}) + dest_dict.update({"port_protocol": port_dict}) + ace_dict.update({"destination": dest_dict}) + protocol_option_dict = {} + tcp_dict = {} + icmp_dict = {} + ip_dict = {} + if not dev_config_remainder: + if bool(ace_dict): + ace_list.append(ace_dict.copy()) + if len(ace_list): + name_dict = name_dict.copy() + name_dict.update({"aces": ace_list[:]}) + # acls_list.append(name_dict) + continue + if protocol in ["tcp", "6"]: + protocol = "tcp" + flags_dict = {} + if ( + dev_config_remainder + and dev_config_remainder[0] in flags + ): + flaglist = dev_config_remainder[:] + for config_remainder in flaglist: + if config_remainder not in flags: + break + flags_dict.update({config_remainder: True}) + dev_config_remainder.pop(0) + if bool(flags_dict): + tcp_dict.update({"flags": flags_dict}) + if bool(tcp_dict): + protocol_option_dict.update({"tcp": tcp_dict}) + if ( + protocol == "icmp" + or protocol == "icmpv6" + or protocol == "1" + or protocol == "58" + ): + if protocol == "1": + protocol = "icmp" + elif protocol == "58": + protocol = "icmpv6" + if ( + dev_config_remainder + and dev_config_remainder[0] not in others + ): + icmp_dict.update({dev_config_remainder[0]: True}) + dev_config_remainder.pop(0) + if bool(icmp_dict): + protocol_option_dict.update({protocol: icmp_dict}) + if protocol in ["ip", "ipv6"]: + if ( + dev_config_remainder + and dev_config_remainder[0] == "nexthop_group" + ): + dev_config_remainder.pop(0) + ip_dict.update( + {"nexthop_group": dev_config_remainder.pop(0)}, + ) + if bool(ip_dict): + protocol_option_dict.update({protocol: ip_dict}) + if bool(protocol_option_dict): + ace_dict.update( + {"protocol_options": protocol_option_dict}, + ) + if ( + dev_config_remainder + and dev_config_remainder[0] == "ttl" + ): + dev_config_remainder.pop(0) + op = dev_config_remainder.pop(0) + ttl_dict = {op: dev_config_remainder.pop(0)} + ace_dict.update({"ttl": ttl_dict}) + for config_remainder in dev_config_remainder: + if config_remainder in others: + if config_remainder == "hop_limit": + hop_index = dev_config_remainder.index( + config_remainder, + ) + hoplimit_dict = { + dev_config_remainder[ + hop_index + 1 + ]: dev_config_remainder[hop_index + 2], + } + ace_dict.update({"hop_limit": hoplimit_dict}) + dev_config_remainder.pop(0) + continue + ace_dict.update({config_remainder: True}) + dev_config_remainder.pop(0) + if dev_config_remainder: + config.update({"line": dev_config}) + return utils.remove_empties(config) + if bool(ace_dict): + ace_list.append(ace_dict.copy()) + if len(ace_list): + name_dict = name_dict.copy() + name_dict.update({"aces": ace_list[:]}) + acls_list.append(name_dict.copy()) + config.update({"acls": acls_list}) + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_address_family/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_address_family/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_address_family/bgp_address_family.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_address_family/bgp_address_family.py new file mode 100644 index 000000000..649e5c6eb --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_address_family/bgp_address_family.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos bgp_address_family fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.bgp_address_family.bgp_address_family import ( + Bgp_afArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.bgp_address_family import ( + Bgp_afTemplate, +) + + +class Bgp_afFacts(object): + """The eos bgp_address_family facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Bgp_afArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section router\\sbgp ") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Bgp_af network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = [] + + if not data: + data = self.get_config(connection) + + # remove global configs from bgp_address_family + bgp_af_config = [] + vrf_set = "" + start = False + for bgp_line in data.splitlines(): + if "router bgp" in bgp_line: + bgp_af_config.append(bgp_line) + vrf_present = re.search(r"vrf\s\S+", bgp_line) + if vrf_present: + vrf_set = vrf_present.group(0) + if start: + bgp_af_config.append(bgp_line) + if "address-family" in bgp_line: + af_line = vrf_set + bgp_line + bgp_af_config.append(af_line) + start = True + if start and "!" in bgp_line: + start = False + + # parse native config using the Bgp_af template + bgp_af_parser = Bgp_afTemplate(lines=bgp_af_config) + objs = bgp_af_parser.parse() + if objs: + if "address_family" in objs: + objs["address_family"] = list(objs["address_family"].values()) + for af in objs["address_family"]: + if "neighbor" in af: + af["neighbor"] = list(af["neighbor"].values()) + if "network" in af: + af["network"] = list(af["network"].values()) + af["network"] = sorted( + af["network"], + key=lambda k: k["address"], + ) + + ansible_facts["ansible_network_resources"].pop( + "bgp_address_family", + None, + ) + + params = utils.remove_empties( + utils.validate_config(self.argument_spec, {"config": objs}), + ) + + facts["bgp_address_family"] = params.get("config", []) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_global/bgp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_global/bgp_global.py new file mode 100644 index 000000000..9cb785a3c --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/bgp_global/bgp_global.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos bgp_global fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.bgp_global.bgp_global import ( + Bgp_globalArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.bgp_global import ( + Bgp_globalTemplate, +) + + +class Bgp_globalFacts(object): + """The eos bgp_global facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Bgp_globalArgs.argument_spec + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section router\\sbgp ") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Bgp_global network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = [] + if not data: + data = self.get_config(connection) + + # remove address_family configs from bgp_global + bgp_global_config = [] + start = False + self._af = False + not_bgp = False + for bgp_line in data.splitlines(): + if "router " in bgp_line: + # Skip other protocol configs like router ospf etc + if "router bgp" not in bgp_line: + not_bgp = True + continue + not_bgp = False + if not start and not not_bgp: + bgp_global_config.append(bgp_line) + if "address-family" in bgp_line: + start = True + self._af = True + if start and "!" in bgp_line: + start = False + + # parse native config using the Bgp_global template + bgp_global_parser = Bgp_globalTemplate( + lines=bgp_global_config, + module=self._module, + ) + objs = bgp_global_parser.parse() + + if objs: + global_vals = objs.get("vrfs", {}).pop("vrf_", {}) + for key, value in iteritems(global_vals): + objs[key] = value + + if "vrfs" in objs: + objs["vrfs"] = list(objs["vrfs"].values()) + for vrf in objs["vrfs"]: + if "neighbor" in vrf: + vrf["neighbor"] = list(vrf["neighbor"].values()) + if "network" in vrf: + vrf["network"] = list(vrf["network"].values()) + vrf["network"] = sorted( + vrf["network"], + key=lambda k: k["address"], + ) + if "aggregate_address" in vrf: + vrf["aggregate_address"] = sorted( + vrf["aggregate_address"], + key=lambda k: k["address"], + ) + + if "neighbor" in objs: + objs["neighbor"] = list(objs["neighbor"].values()) + + if "network" in objs: + objs["network"] = list(objs["network"].values()) + objs["network"] = sorted( + objs["network"], + key=lambda k: k["address"], + ) + if "aggregate_address" in objs: + objs["aggregate_address"] = sorted( + objs["aggregate_address"], + key=lambda k: k["address"], + ) + + ansible_facts["ansible_network_resources"].pop("bgp_global", None) + + params = utils.remove_empties( + bgp_global_parser.validate_config( + self.argument_spec, + {"config": objs}, + redact=True, + ), + ) + + facts["bgp_global"] = params.get("config", []) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/facts.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/facts.py new file mode 100644 index 000000000..87fd402eb --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/facts.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The facts class for eos +this file validates each subset of facts and selectively +calls the appropriate facts gathering function +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts import ( + FactsBase, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.acl_interfaces.acl_interfaces import ( + Acl_interfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.acls.acls import ( + AclsFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.bgp_address_family.bgp_address_family import ( + Bgp_afFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.bgp_global.bgp_global import ( + Bgp_globalFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.hostname.hostname import ( + HostnameFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.interfaces.interfaces import ( + InterfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.l2_interfaces.l2_interfaces import ( + L2_interfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.l3_interfaces.l3_interfaces import ( + L3_interfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.lacp.lacp import ( + LacpFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.lacp_interfaces.lacp_interfaces import ( + Lacp_interfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.lag_interfaces.lag_interfaces import ( + Lag_interfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.legacy.base import ( + Config, + Default, + Hardware, + Interfaces, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.lldp_global.lldp_global import ( + Lldp_globalFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.lldp_interfaces.lldp_interfaces import ( + Lldp_interfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.logging_global.logging_global import ( + Logging_globalFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.ntp_global.ntp_global import ( + Ntp_globalFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.ospf_interfaces.ospf_interfaces import ( + Ospf_interfacesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.ospfv2.ospfv2 import ( + Ospfv2Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.ospfv3.ospfv3 import ( + Ospfv3Facts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.prefix_lists.prefix_lists import ( + Prefix_listsFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.route_maps.route_maps import ( + Route_mapsFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.snmp_server.snmp_server import ( + Snmp_serverFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.static_routes.static_routes import ( + Static_routesFacts, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.facts.vlans.vlans import ( + VlansFacts, +) + + +FACT_LEGACY_SUBSETS = dict( + default=Default, + hardware=Hardware, + interfaces=Interfaces, + config=Config, +) +FACT_RESOURCE_SUBSETS = dict( + interfaces=InterfacesFacts, + l2_interfaces=L2_interfacesFacts, + l3_interfaces=L3_interfacesFacts, + lacp=LacpFacts, + lacp_interfaces=Lacp_interfacesFacts, + lag_interfaces=Lag_interfacesFacts, + lldp_global=Lldp_globalFacts, + lldp_interfaces=Lldp_interfacesFacts, + vlans=VlansFacts, + acl_interfaces=Acl_interfacesFacts, + acls=AclsFacts, + static_routes=Static_routesFacts, + ospfv2=Ospfv2Facts, + ospfv3=Ospfv3Facts, + ospf_interfaces=Ospf_interfacesFacts, + bgp_address_family=Bgp_afFacts, + bgp_global=Bgp_globalFacts, + route_maps=Route_mapsFacts, + prefix_lists=Prefix_listsFacts, + logging_global=Logging_globalFacts, + ntp_global=Ntp_globalFacts, + snmp_server=Snmp_serverFacts, + hostname=HostnameFacts, +) + + +class Facts(FactsBase): + """The fact class for eos""" + + VALID_LEGACY_GATHER_SUBSETS = frozenset(FACT_LEGACY_SUBSETS.keys()) + VALID_RESOURCE_SUBSETS = frozenset(FACT_RESOURCE_SUBSETS.keys()) + + def get_facts( + self, + legacy_facts_type=None, + resource_facts_type=None, + data=None, + ): + """Collect the facts for eos + :param legacy_facts_type: List of legacy facts types + :param resource_facts_type: List of resource fact types + :param data: previously collected conf + :rtype: dict + :return: the facts gathered + """ + if self.VALID_RESOURCE_SUBSETS: + self.get_network_resources_facts( + FACT_RESOURCE_SUBSETS, + resource_facts_type, + data, + ) + + if self.VALID_LEGACY_GATHER_SUBSETS: + self.get_network_legacy_facts( + FACT_LEGACY_SUBSETS, + legacy_facts_type, + ) + return self.ansible_facts, self._warnings diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/hostname/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/hostname/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/hostname/hostname.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/hostname/hostname.py new file mode 100644 index 000000000..1c95fe576 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/hostname/hostname.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos hostname fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.hostname.hostname import ( + HostnameArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.hostname import ( + HostnameTemplate, +) + + +class HostnameFacts(object): + """The eos hostname facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = HostnameArgs.argument_spec + + def get_config(self, connection): + return connection.get("show running-config | section ^hostname") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Hostname network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = [] + + if not data: + data = self.get_config(connection) + + # parse native config using the Hostname template + hostname_parser = HostnameTemplate( + lines=data.splitlines(), + module=self._module, + ) + objs = hostname_parser.parse() + + ansible_facts["ansible_network_resources"].pop("hostname", None) + + params = utils.remove_empties( + hostname_parser.validate_config( + self.argument_spec, + {"config": objs}, + redact=True, + ), + ) + + facts["hostname"] = params.get("config", {}) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/interfaces/interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/interfaces/interfaces.py new file mode 100644 index 000000000..f4d77637e --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/interfaces/interfaces.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.interfaces.interfaces import ( + InterfacesArgs, +) + + +class InterfacesFacts(object): + """The eos interfaces fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = InterfacesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section ^interface") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for interfaces + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected configuration + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # operate on a collection of resource x + config = ("\n" + data).split("\ninterface ") + objs = [] + for conf in config: + if conf: + obj = self.render_config(self.generated_spec, conf) + if obj: + objs.append(obj) + facts = {"interfaces": []} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + for cfg in params["config"]: + facts["interfaces"].append(utils.remove_empties(cfg)) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + + # populate the facts from the configuration + config["name"] = re.match(r"(\S+)", conf).group(1) + description = utils.parse_conf_arg(conf, "description") + if description is not None: + config["description"] = description.replace('"', "") + shutdown = utils.parse_conf_cmd_arg(conf, "shutdown", False) + config["enabled"] = shutdown if shutdown is False else True + config["mtu"] = utils.parse_conf_arg(conf, "mtu") + config["mode"] = utils.parse_conf_cmd_arg( + conf, + "switchport", + "layer2", + "layer3", + ) + + state = utils.parse_conf_arg(conf, "speed") + if state: + if state == "auto": + config["duplex"] = state + else: + # remaining options are all e.g., 10half or 40gfull + config["speed"] = state[:-4] + config["duplex"] = state[-4:] + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l2_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l2_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l2_interfaces/l2_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l2_interfaces/l2_interfaces.py new file mode 100644 index 000000000..b77b1a611 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l2_interfaces/l2_interfaces.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos l2_interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.l2_interfaces.l2_interfaces import ( + L2_interfacesArgs, +) + + +class L2_interfacesFacts(object): + """The eos l2_interfaces fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = L2_interfacesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section ^interface") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for l2_interfaces + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected configuration + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # operate on a collection of resource x + config = ("\n" + data).split("\ninterface ") + objs = [] + for conf in config: + if conf: + obj = self.render_config(self.generated_spec, conf) + if obj: + objs.append(obj) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["l2_interfaces"] = [ + utils.remove_empties(cfg) for cfg in params["config"] + ] + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + + # populate the facts from the configuration + config["name"] = re.match(r"(\S+)", conf).group(1).replace('"', "") + has_mode = re.search(r"switchport mode (\S+)", conf) + if has_mode: + config["mode"] = has_mode.group(1) + + has_access = re.search(r"switchport access vlan (\d+)", conf) + if has_access: + config["access"] = {"vlan": int(has_access.group(1))} + + has_trunk = re.findall(r"switchport trunk (.+)", conf) + if has_trunk: + trunk = {} + for match in has_trunk: + has_native = re.match(r"native vlan (\d+)", match) + if has_native: + trunk["native_vlan"] = int(has_native.group(1)) + continue + + has_allowed = re.match(r"allowed vlan (\S+)", match) + if has_allowed: + # TODO: listify? + trunk["trunk_allowed_vlans"] = has_allowed.group(1) + continue + config["trunk"] = trunk + + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l3_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l3_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l3_interfaces/l3_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l3_interfaces/l3_interfaces.py new file mode 100644 index 000000000..3a617507e --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/l3_interfaces/l3_interfaces.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos l3_interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.l3_interfaces.l3_interfaces import ( + L3_interfacesArgs, +) + + +class L3_interfacesFacts(object): + """The eos l3_interfaces fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = L3_interfacesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section ^interface") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for l3_interfaces + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected configuration + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # split the config into instances of the resource + resource_delim = "interface" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + + objs = [] + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.append(obj) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["l3_interfaces"] = [ + utils.remove_empties(cfg) for cfg in params["config"] + ] + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + + config["name"] = utils.parse_conf_arg(conf, "interface") + + matches = re.findall(r".*ip address (.+)$", conf, re.MULTILINE) + if matches: + config["ipv4"] = [] + for match in matches: + address, dummy, remainder = match.partition(" ") + if address == "virtual": + ipv4 = {"virtual": True, "address": remainder} + else: + ipv4 = {"address": address} + if remainder == "secondary": + ipv4["secondary"] = True + config["ipv4"].append(ipv4) + + matches = re.findall(r".*ipv6 address (.+)$", conf, re.MULTILINE) + if matches: + config["ipv6"] = [] + for match in matches: + address, dummy, remainder = match.partition(" ") + ipv6 = {"address": address} + config["ipv6"].append(ipv6) + + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp/lacp.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp/lacp.py new file mode 100644 index 000000000..28ba476b8 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp/lacp.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos lacp fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.lacp.lacp import ( + LacpArgs, +) + + +class LacpFacts(object): + """The eos lacp fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = LacpArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section ^lacp") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for lacp + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected configuration + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # split the config into instances of the resource + resource_delim = "lacp" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + + objs = {} + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.update(obj) + + ansible_facts["ansible_network_resources"].pop("lacp", None) + facts = {"lacp": {}} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["lacp"] = utils.remove_empties(params["config"]) + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + config["system"]["priority"] = utils.parse_conf_arg( + conf, + "system-priority", + ) + + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp_interfaces/lacp_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp_interfaces/lacp_interfaces.py new file mode 100644 index 000000000..6961ca1b6 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lacp_interfaces/lacp_interfaces.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos lacp_interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.lacp_interfaces.lacp_interfaces import ( + Lacp_interfacesArgs, +) + + +class Lacp_interfacesFacts(object): + """The eos lacp_interfaces fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Lacp_interfacesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section lacp") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for lacp_interfaces + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected configuration + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # split the config into instances of the resource + resource_delim = "interface" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + + objs = [] + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("lacp_interfaces", None) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["lacp_interfaces"] = [ + utils.remove_empties(cfg) for cfg in params["config"] + ] + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + config["name"] = utils.parse_conf_arg(conf, "interface") + config["port_priority"] = utils.parse_conf_arg(conf, "port-priority") + config["timer"] = utils.parse_conf_arg(conf, "timer") + + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lag_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lag_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lag_interfaces/lag_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lag_interfaces/lag_interfaces.py new file mode 100644 index 000000000..73b6be3bb --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lag_interfaces/lag_interfaces.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos lag_interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.lag_interfaces.lag_interfaces import ( + Lag_interfacesArgs, +) + + +class Lag_interfacesFacts(object): + """The eos lag_interfaces fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Lag_interfacesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section ^interface") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for lag_interfaces + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected configuration + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # split the config into instances of the resource + resource_delim = "interface" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + + objs = {} + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + group_name = obj["name"] + if group_name in objs and "members" in obj: + config = objs[group_name] + if "members" not in config: + config["members"] = [] + objs[group_name]["members"].extend(obj["members"]) + else: + objs[group_name] = obj + objs = list(objs.values()) + facts = {"lag_interfaces": []} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["lag_interfaces"] = [ + utils.remove_empties(cfg) for cfg in params["config"] + ] + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + interface_name = utils.parse_conf_arg(conf, "interface") + if interface_name.startswith("Port-Channel"): + config["name"] = interface_name + return utils.remove_empties(config) + + interface = {"member": interface_name} + match = re.match( + r".*channel-group (\d+) mode (\S+)", + conf, + re.MULTILINE | re.DOTALL, + ) + if match: + config["name"], interface["mode"] = match.groups() + config["name"] = "Port-Channel" + config["name"] + config["members"] = [interface] + + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/legacy/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/legacy/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/legacy/base.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/legacy/base.py new file mode 100644 index 000000000..6e0424f15 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/legacy/base.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import platform +import re + +from ansible.module_utils.six import iteritems + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.eos import ( + get_capabilities, + run_commands, +) + + +class FactsBase(object): + COMMANDS = frozenset() + + def __init__(self, module): + self.module = module + self.warnings = list() + self.facts = dict() + self.responses = None + + def populate(self): + self.responses = run_commands( + self.module, + list(self.COMMANDS), + check_rc=False, + ) + + +class Default(FactsBase): + SYSTEM_MAP = {"serialNumber": "serialnum"} + + COMMANDS = ["show version | json", "show hostname | json"] + + def populate(self): + super(Default, self).populate() + data = self.responses[0] + for key, value in iteritems(self.SYSTEM_MAP): + if key in data: + self.facts[value] = data[key] + + self.facts.update(self.responses[1]) + self.facts.update(self.platform_facts()) + + def platform_facts(self): + platform_facts = {} + + resp = get_capabilities(self.module) + device_info = resp["device_info"] + + platform_facts["system"] = device_info["network_os"] + + for item in ("model", "image", "version", "platform", "hostname"): + val = device_info.get("network_os_%s" % item) + if val: + platform_facts[item] = val + + platform_facts["api"] = resp["network_api"] + platform_facts["python_version"] = platform.python_version() + + return platform_facts + + +class Hardware(FactsBase): + COMMANDS = ["dir all-filesystems", "show version | json"] + + def populate(self): + super(Hardware, self).populate() + self.facts.update(self.populate_filesystems()) + self.facts.update(self.populate_memory()) + + def populate_filesystems(self): + data = self.responses[0] + + if isinstance(data, dict): + data = data["messages"][0] + + fs = re.findall(r"^Directory of (.+)/", data, re.M) + return dict(filesystems=fs) + + def populate_memory(self): + values = self.responses[1] + return dict( + memfree_mb=int(values["memFree"]) / 1024, + memtotal_mb=int(values["memTotal"]) / 1024, + ) + + +class Config(FactsBase): + COMMANDS = ["show running-config"] + + def populate(self): + super(Config, self).populate() + self.facts["config"] = self.responses[0] + + +class Interfaces(FactsBase): + INTERFACE_MAP = { + "description": "description", + "physicalAddress": "macaddress", + "mtu": "mtu", + "bandwidth": "bandwidth", + "duplex": "duplex", + "lineProtocolStatus": "lineprotocol", + "interfaceStatus": "operstatus", + "forwardingModel": "type", + } + + COMMANDS = ["show interfaces | json", "show lldp neighbors | json"] + + def populate(self): + super(Interfaces, self).populate() + + self.facts["all_ipv4_addresses"] = list() + self.facts["all_ipv6_addresses"] = list() + + data = self.responses[0] + if data and "LLDP is not enabled" not in data: + self.facts["interfaces"] = self.populate_interfaces(data) + + if len(self.responses) > 1: + data = self.responses[1] + if data: + self.facts["neighbors"] = self.populate_neighbors( + data["lldpNeighbors"], + ) + + def populate_interfaces(self, data): + facts = dict() + for key, value in iteritems(data["interfaces"]): + intf = dict() + + for remote, local in iteritems(self.INTERFACE_MAP): + if remote in value: + intf[local] = value[remote] + + if "interfaceAddress" in value: + intf["ipv4"] = dict() + for entry in value["interfaceAddress"]: + intf["ipv4"]["address"] = entry["primaryIp"]["address"] + intf["ipv4"]["masklen"] = entry["primaryIp"]["maskLen"] + self.add_ip_address(entry["primaryIp"]["address"], "ipv4") + + if "interfaceAddressIp6" in value: + intf["ipv6"] = dict() + for entry in value["interfaceAddressIp6"]["globalUnicastIp6s"]: + intf["ipv6"]["address"] = entry["address"] + intf["ipv6"]["subnet"] = entry["subnet"] + self.add_ip_address(entry["address"], "ipv6") + + facts[key] = intf + + return facts + + def add_ip_address(self, address, family): + if family == "ipv4": + self.facts["all_ipv4_addresses"].append(address) + else: + self.facts["all_ipv6_addresses"].append(address) + + def populate_neighbors(self, neighbors): + facts = dict() + for value in neighbors: + port = value["port"] + if port not in facts: + facts[port] = list() + lldp = dict() + lldp["host"] = value["neighborDevice"] + lldp["port"] = value["neighborPort"] + facts[port].append(lldp) + return facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_global/lldp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_global/lldp_global.py new file mode 100644 index 000000000..d59be7c54 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_global/lldp_global.py @@ -0,0 +1,102 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos lldp_global fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.lldp_global.lldp_global import ( + Lldp_globalArgs, +) + + +class Lldp_globalFacts(object): + """The eos lldp_global fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Lldp_globalArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section lldp") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for lldp_global + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + obj = {} + if data: + obj.update(self.render_config(self.generated_spec, data)) + + ansible_facts["ansible_network_resources"].pop("lldp_global", None) + facts = {} + if obj: + params = utils.validate_config(self.argument_spec, {"config": obj}) + facts["lldp_global"] = utils.remove_empties(params["config"]) + else: + facts["lldp_global"] = {} + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + config["holdtime"] = utils.parse_conf_arg(conf, "hold-time") + config["reinit"] = utils.parse_conf_arg(conf, "timer reinitialization") + config["timer"] = utils.parse_conf_arg(conf, "timer") + if config.get("timer") and "reinitialization" in config["timer"]: + config["timer"] = None + + for match in re.findall( + r"^(no)? lldp tlv transmit (\S+)", + conf, + re.MULTILINE, + ): + tlv_option = match[1].replace("-", "_") + config["tlv_select"][tlv_option] = bool(match[0] != "no") + + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_interfaces/lldp_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_interfaces/lldp_interfaces.py new file mode 100644 index 000000000..569986ef2 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/lldp_interfaces/lldp_interfaces.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos lldp_interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.lldp_interfaces.lldp_interfaces import ( + Lldp_interfacesArgs, +) + + +class Lldp_interfacesFacts(object): + """The eos lldp_interfaces fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Lldp_interfacesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for lldp_interfaces + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected configuration + :rtype: dictionary + :returns: facts + """ + if not data: + data = connection.get("show running-config | section lldp") + + # split the config into instances of the resource + resource_delim = "interface" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + + objs = [] + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.append(obj) + + ansible_facts["ansible_network_resources"].pop("lldp_interfaces", None) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["lldp_interfaces"] = [ + utils.remove_empties(cfg) for cfg in params["config"] + ] + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + config["name"] = utils.parse_conf_arg(conf, "interface") + + matches = re.findall(r"(no )?lldp (\S+)", conf) + for match in matches: + config[match[1]] = not bool(match[0]) + + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/logging_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/logging_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/logging_global/logging_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/logging_global/logging_global.py new file mode 100644 index 000000000..e2e0e2cfd --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/logging_global/logging_global.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos logging_global fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.logging_global.logging_global import ( + Logging_globalArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.logging_global import ( + Logging_globalTemplate, +) + + +class Logging_globalFacts(object): + """The eos logging_global facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Logging_globalArgs.argument_spec + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section logging") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Logging_global network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = {} + + if not data: + data = self.get_config(connection) + + # parse native config using the Prefix_lists template + logging_parser = Logging_globalTemplate( + lines=data.splitlines(), + module=self._module, + ) + objs = logging_parser.parse() + if objs: + if "hosts" in objs: + objs["hosts"] = sorted( + list(objs["hosts"].values()), + key=lambda k, sk="name": k[sk], + ) + if "vrfs" in objs: + for k, v in iteritems(objs["vrfs"]): + if "hosts" in v: + v["hosts"] = sorted( + list(v["hosts"].values()), + key=lambda k, sk="name": k[sk], + ) + objs["vrfs"] = sorted( + list(objs["vrfs"].values()), + key=lambda k, sk="name": k[sk], + ) + else: + objs = {} + ansible_facts["ansible_network_resources"].pop("logging_global", None) + + params = utils.remove_empties( + logging_parser.validate_config( + self.argument_spec, + {"config": objs}, + redact=True, + ), + ) + + facts["logging_global"] = params.get("config", {}) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ntp_global/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ntp_global/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ntp_global/ntp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ntp_global/ntp_global.py new file mode 100644 index 000000000..96c2321c7 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ntp_global/ntp_global.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos ntp_global fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.ntp_global.ntp_global import ( + Ntp_globalArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.ntp_global import ( + Ntp_globalTemplate, +) + + +class Ntp_globalFacts(object): + """The eos ntp_global facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Ntp_globalArgs.argument_spec + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section ntp") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Ntp_global network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = {} + + if not data: + data = self.get_config(connection) + + # parse native config using the Ntp_global template + ntp_global_parser = Ntp_globalTemplate( + lines=data.splitlines(), + module=self._module, + ) + objs = ntp_global_parser.parse() + if objs: + if "authentication_keys" in objs: + objs["authentication_keys"] = sorted( + list(objs["authentication_keys"].values()), + key=lambda k, sk="id": k[sk], + ) + if "serve" in objs: + if "access_lists" in objs["serve"]: + objs["serve"]["access_lists"] = sorted( + list(objs["serve"]["access_lists"].values()), + key=lambda k, sk="afi": k[sk], + ) + if "servers" in objs: + objs["servers"] = sorted( + list(objs["servers"].values()), + key=lambda k, sk="server": k[sk], + ) + else: + objs = {} + ansible_facts["ansible_network_resources"].pop("ntp_global", None) + + params = utils.remove_empties( + ntp_global_parser.validate_config( + self.argument_spec, + {"config": objs}, + redact=True, + ), + ) + + facts["ntp_global"] = params.get("config", {}) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospf_interfaces/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospf_interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospf_interfaces/ospf_interfaces.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospf_interfaces/ospf_interfaces.py new file mode 100644 index 000000000..981b6bca7 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospf_interfaces/ospf_interfaces.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos ospf_interfaces fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +import re + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.ospf_interfaces.ospf_interfaces import ( + Ospf_interfacesArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.ospf_interfaces import ( + Ospf_interfacesTemplate, +) + + +class Ospf_interfacesFacts(object): + """The eos ospf_interfaces facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Ospf_interfacesArgs.argument_spec + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section interface ") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Ospf_interfaces network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + + if not data: + data = self.get_config(connection) + + resource_delim = "interface" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + # parse native config using the Ospf_interfaces template + ospf_interfaces_facts = [] + for resource in resources: + ospf_interfaces_parser = Ospf_interfacesTemplate( + lines=resource.splitlines(), + module=self._module, + ) + entry = ospf_interfaces_parser.parse() + if entry: + if "address_family" in entry and entry["address_family"]: + entry["address_family"] = sorted( + list(entry["address_family"].values()), + key=lambda k, sk="afi": k[sk], + ) + if entry: + if entry.get("address_family"): + for addr in entry["address_family"]: + if "ip_params" in addr: + addr["ip_params"] = sorted( + list(addr["ip_params"].values()), + key=lambda k, sk="afi": k[sk], + ) + ospf_interfaces_facts.append(entry) + + ansible_facts["ansible_network_resources"].pop("ospf_interfaces", None) + facts = {"ospf_interfaces": []} + params = utils.remove_empties( + ospf_interfaces_parser.validate_config( + self.argument_spec, + {"config": ospf_interfaces_facts}, + redact=True, + ), + ) + + if params.get("config"): + for cfg in params["config"]: + facts["ospf_interfaces"].append(utils.remove_empties(cfg)) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv2/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv2/ospfv2.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv2/ospfv2.py new file mode 100644 index 000000000..f5f35541a --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv2/ospfv2.py @@ -0,0 +1,510 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos ospfv2 fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.ospfv2.ospfv2 import ( + Ospfv2Args, +) + + +class Ospfv2Facts(object): + """The eos ospfv2 fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Ospfv2Args.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | section ospf") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for ospfv2 + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + + if not data: + data = self.get_device_data(connection) + + # split the config into instances of the resource + resource_delim = "router ospf" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + objs_list = [] + objs = {} + for resource in resources: + if resource and "router ospfv3" not in resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs_list.append(obj) + objs = {"processes": objs_list} + ansible_facts["ansible_network_resources"].pop("ospfv2", None) + + facts = {} + if objs: + facts["ospfv2"] = {} + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["ospfv2"].update(utils.remove_empties(params["config"])) + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + instance_list = [] + ospf_params_dict = {} + areas_list = [] + distance_dict = {} + network_list = [] + redistribute_list = [] + timers_list = [] + areas_list = [] + for dev_config in conf.split("\n"): + if not dev_config: + continue + network_dict = {} + redistribute_dict = {} + dev_config = dev_config.strip() + dev_config = re.sub(r"-", "_", dev_config).strip() + matches = re.findall(r"router (ospf) (.*)", dev_config) + if matches: + if ospf_params_dict: + instance_list.append(ospf_params_dict) + ospf_params_dict = {} + instance = matches[0][1].split() + ospf_params_dict.update({"process_id": str(instance[0])}) + if "vrf" in dev_config: + vrf_name = instance[-1] + else: + vrf_name = None + ospf_params_dict.update({"vrf": vrf_name}) + if "traffic_engineering" in dev_config: + ospf_params_dict.update({"traffic_engineering": True}) + config_params = dev_config.split() + if config_params[0] == "adjacency": + threshold = config_params[-1] + adjacency_dict = {"exchange_start": {"threshold": threshold}} + ospf_params_dict.update({"adjacency": adjacency_dict}) + elif "auto_cost" in dev_config: + bw = config_params[-1] + ospf_params_dict.update( + {"auto_cost": {"reference_bandwidth": bw}}, + ) + elif "bfd" in dev_config: + ospf_params_dict.update({"bfd": {"all_interfaces": True}}) + elif config_params[0] == "default_information": + def_dict = {"originate": True} + for i, val in enumerate(config_params[2::]): + if val == "always": + def_dict.update({"always": True}) + elif val in ["route_map", "metric", "metric_type"]: + def_dict.update({val: config_params[i + 3]}) + ospf_params_dict.update({"default_information": def_dict}) + elif "default_metric" in dev_config: + ospf_params_dict.update({"default_metric": config_params[-1]}) + elif "distance" in dev_config: + distance_dict.update({config_params[-2]: config_params[-1]}) + ospf_params_dict.update({"distance": distance_dict}) + elif "distribute_list" in dev_config: + ospf_params_dict.update( + {"distribute_list": {config_params[1]: config_params[2]}}, + ) + elif "dn_bit_ignore" in dev_config: + ospf_params_dict.update({"dn_bit_ignore": True}) + elif "fips_restrictions" in dev_config: + ospf_params_dict.update({"fips_restrictions": True}) + elif "graceful_restart" in dev_config: + if "grace_period" in dev_config: + ospf_params_dict.update( + { + "graceful_restart": { + "grace_period": config_params[-1], + }, + }, + ) + else: + ospf_params_dict.update( + {"graceful_restart": {"set": True}}, + ) + elif "graceful_restart_helper" in dev_config: + ospf_params_dict.update({"graceful_restart_helper": True}) + elif "log_adjacency_changes" in dev_config: + detail = True if "detail" in dev_config else False + ospf_params_dict.update( + {"log_adjacency_changes": {"detail": detail}}, + ) + elif "max_lsa" in dev_config: + max_lsa_dict = {} + config_params.pop(0) + max_lsa_dict.update({"count": config_params.pop(0)}) + if config_params: + if config_params[0].isdigit(): + max_lsa_dict.update( + {"threshold": config_params.pop(0)}, + ) + for i, el in enumerate(config_params): + if el == "warning_only": + max_lsa_dict.update({"warning": True}) + if el in ["ignore_count", "ignore_time", "reset_time"]: + max_lsa_dict.update({el: config_params[i + 1]}) + ospf_params_dict.update({"max_lsa": max_lsa_dict}) + elif "maximum_paths" in dev_config: + ospf_params_dict.update({"maximum_paths": config_params[1]}) + elif "mpls ldp sync default" in dev_config: + ospf_params_dict.update({"mpls_ldp": True}) + elif config_params[0] == "network": + config_params.pop(0) + prefix = re.search(r"\/", config_params[0]) + if prefix: + network_dict.update({"prefix": config_params.pop(0)}) + else: + network_dict.update( + {"network_address": config_params.pop(0)}, + ) + network_dict.update({"mask": config_params.pop(0)}) + network_dict.update({"area": config_params[-1]}) + network_list.append(network_dict) + ospf_params_dict.update({"networks": network_list}) + elif "passive_interface" in dev_config: + if config_params[1] == "default": + ospf_params_dict.update( + {"passive_interface": {"default": True}}, + ) + else: + ospf_params_dict.update( + { + "passive_interface": { + "interface_list": config_params[1], + }, + }, + ) + elif "point_to_point" in dev_config: + ospf_params_dict.update({"point_to_point": True}) + elif "redistribute" in dev_config: + redistribute_dict.update({"routes": config_params[1]}) + if config_params[1] == "isis": + if "level" in config_params[2]: + k = re.sub(r"_", "-", config_params[2]) + redistribute_dict.update({"isis_level": k}) + if "route_map" in dev_config: + redistribute_dict.update({"route_map": config_params[-1]}) + redistribute_list.append(redistribute_dict) + ospf_params_dict.update({"redistribute": redistribute_list}) + elif "router_id" in dev_config: + ospf_params_dict.update({"router_id": config_params[-1]}) + elif "retransmission_threshold" in dev_config: + ospf_params_dict.update( + {"retransmission_threshold": config_params[-1]}, + ) + elif config_params[0] == "compatible": + ospf_params_dict.update({"rfc1583compatibility": True}) + elif "shutdown" in dev_config: + ospf_params_dict.update({"shutdown": True}) + elif "summary_address" in dev_config: + summary_address_dict = {} + config_params.pop(0) + prefix = re.search(r"\/", config_params[0]) + if prefix: + summary_address_dict.update( + {"prefix": config_params.pop(0)}, + ) + else: + summary_address_dict.update( + {"address": config_params.pop(0)}, + ) + summary_address_dict.update({"mask": config_params.pop(0)}) + if "not_advertise" in dev_config: + summary_address_dict.update({"not_advertise": True}) + config_params.pop(0) + else: + if config_params: + summary_address_dict.update( + {config_params[0]: config_params[1]}, + ) + ospf_params_dict.update( + {"summary_address": summary_address_dict}, + ) + elif "timers" in dev_config: + timers_dict = {} + if config_params[1] == "lsa": + if config_params[2] in ["rx", "arrival"]: + timers_dict.update( + { + "lsa": { + "rx": {"min_interval": config_params[-1]}, + }, + }, + ) + else: + timers_dict.update( + { + "lsa": { + "tx": { + "delay": { + "initial": config_params[-3], + "min": config_params[-2], + "max": config_params[-1], + }, + }, + }, + }, + ) + elif config_params[1] == "out_delay": + timers_dict.update({"out_delay": config_params[-1]}) + elif config_params[1] == "pacing": + timers_dict.update({"pacing": config_params[-1]}) + elif config_params[1] == "spf": + if config_params[2] == "delay": + timers_dict.update( + { + "spf": { + "tx": { + "delay": { + "initial": config_params[-3], + "min": config_params[-2], + "max": config_params[-1], + }, + }, + }, + }, + ) + else: + timers_dict.update( + {"spf": {"seconds": config_params[-1]}}, + ) + elif config_params[1] == "throttle": + timers_dict.update( + { + "throttle": { + "attr": config_params[2], + "initial": config_params[-3], + "min": config_params[-2], + "max": config_params[-1], + }, + }, + ) + timers_list.append(timers_dict) + ospf_params_dict.update({"timers": timers_list}) + elif config_params[0] == "area": + areas_dict = {} + areas_dict.update({"area_id": config_params[1]}) + if config_params[2] == "default_cost": + areas_dict.update({"default_cost": config_params[-1]}) + elif config_params[2] == "filter": + prefix = re.search(r"\/", config_params[3]) + if prefix: + areas_dict.update( + {"filter": {"address": config_params[3]}}, + ) + elif config_params[3] == "prefix_list": + areas_dict.update( + {"filter": {"prefix_list": config_params[-1]}}, + ) + else: + areas_dict.update( + {"filter": {"subnet_address": config_params[3]}}, + ) + areas_dict.update( + {"filter": {"subnet_mask": config_params[4]}}, + ) + elif config_params[2] == "not_so_stubby": + if len(config_params) == 3: + areas_dict.update({"not_so_stubby": {"set": True}}) + continue + if config_params[3] == "lsa": + areas_dict.update({"not_so_stubby": {"lsa": True}}) + elif config_params[3] == "default_information_originate": + default_dict = {} + for i, val in enumerate(config_params): + if val == "nssa_only": + default_dict.update({"nssa_only": True}) + if val == "metric_type": + default_dict.update( + {"metric_type": config_params[i + 1]}, + ) + if val == "metric": + default_dict.update( + {"metric": config_params[i + 1]}, + ) + areas_dict.update( + { + "not_so_stubby": { + "default_information_originate": default_dict, + }, + }, + ) + elif config_params[3] == "no_summary": + areas_dict.update( + {"not_so_stubby": {"no_summary": True}}, + ) + elif config_params[3] == "nssa_only": + areas_dict.update( + {"not_so_stubby": {"nssa_only": True}}, + ) + elif config_params[2] == "nssa": + if len(config_params) == 3: + areas_dict.update({"nssa": {"set": True}}) + continue + if config_params[3] == "default_information_originate": + default_dict = {} + for i, val in enumerate(config_params): + if val == "nssa_only": + default_dict.update({"nssa_only": True}) + if val == "metric_type": + default_dict.update( + {"metric_type": config_params[i + 1]}, + ) + if val == "metric": + default_dict.update( + {"metric": config_params[i + 1]}, + ) + areas_dict.update( + { + "nssa": { + "default_information_originate": default_dict, + }, + }, + ) + elif config_params[3] == "no_summary": + areas_dict.update({"nssa": {"no_summary": True}}) + elif config_params[3] == "nssa_only": + areas_dict.update({"nssa": {"nssa_only": True}}) + elif config_params[2] == "range": + prefix = re.search(r"\/", config_params[3]) + range_dict = {} + if prefix: + range_dict.update({"address": config_params[3]}) + else: + range_dict.update({"subnet_address": config_params[3]}) + range_dict.update({"subnet_mask": config_params[4]}) + if "advertise" in dev_config: + range_dict.update({"advertise": True}) + if "not_advertise" in dev_config: + range_dict.update({"advertise": False}) + if "cost" in dev_config: + range_dict.update({"cost": config_params[-1]}) + areas_dict.update({"range": range_dict}) + elif config_params[2] == "stub": + if "no_summary" in dev_config: + areas_dict.update({"stub": {"no_summary": True}}) + else: + areas_dict.update({"stub": {"set": True}}) + areas_list.append(areas_dict) + ospf_params_dict.update({"areas": areas_list}) + elif config_params[0] == "max_metric": + config_params.pop(0) + router_lsa_dict = {} + config_params.pop(0) + if not config_params: + ospf_params_dict.update( + {"max_metric": {"router_lsa": {"set": True}}}, + ) + else: + for i, val in enumerate(config_params): + if val == "include_stub": + router_lsa_dict.update({"include_stub": True}) + elif val == "on_startup": + if config_params[i + 1] == "wait_for_bgp": + router_lsa_dict.update( + {"on_startup": {"wait_for_bgp": True}}, + ) + else: + router_lsa_dict.update( + { + "on_startup": { + "time": config_params[i + 1], + }, + }, + ) + elif val == "external_lsa": + if ( + i < len(config_params) + and config_params[i + 1].isdigit() + ): + router_lsa_dict.update( + { + "external_lsa": { + "max_metric_value": config_params[ + i + 1 + ], + }, + }, + ) + else: + router_lsa_dict.update( + {"external_lsa": {"set": True}}, + ) + elif val == "summary_lsa": + if ( + i < len(config_params) - 1 + and config_params[i + 1].isdigit() + ): + router_lsa_dict.update( + { + "summary_lsa": { + "max_metric_value": config_params[ + i + 1 + ], + }, + }, + ) + else: + router_lsa_dict.update( + {"summary_lsa": {"set": True}}, + ) + ospf_params_dict.update( + {"max_metric": {"router_lsa": router_lsa_dict}}, + ) + # instance_list.append(ospf_params_dict) + # config.update({"ospf_version": "v2", "ospf_processes": instance_list}) + return utils.remove_empties(ospf_params_dict) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv3/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv3/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv3/ospfv3.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv3/ospfv3.py new file mode 100644 index 000000000..3efa27cdf --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/ospfv3/ospfv3.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos ospfv3 fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.ospfv3.ospfv3 import ( + Ospfv3Args, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.ospfv3 import ( + Ospfv3Template, +) + + +class Ospfv3Facts(object): + """The eos ospfv3 facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Ospfv3Args.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section ospfv3") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Ospfv3 network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = [] + ospfv3_parser = Ospfv3Template(lines=[], module=self._module) + + if not data: + data = self.get_config(connection) + + # split the config into instances of the resource + resource_delim = "router ospfv3" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + + # parse native config using the Ospfv3 template + ospfv3_facts = {"processes": []} + for resource in resources: + ospfv3_parser = Ospfv3Template( + lines=resource.splitlines(), + module=self._module, + ) + objs = ospfv3_parser.parse() + for key, sortv in [("address_family", "afi")]: + if key in objs["processes"] and objs["processes"][key]: + objs["processes"][key] = list( + objs["processes"][key].values(), + ) + + for addr_family in objs["processes"]["address_family"]: + if "areas" in addr_family: + addr_family["areas"] = list(addr_family["areas"].values()) + + for addr_family in objs["processes"]["address_family"]: + if not addr_family.get("afi"): + # global vars + objs["processes"].update(addr_family) + objs["processes"]["address_family"].remove(addr_family) + + ospfv3_facts["processes"].append(objs["processes"]) + + ansible_facts["ansible_network_resources"].pop("ospfv3", None) + params = ospfv3_parser.validate_config( + self.argument_spec, + {"config": ospfv3_facts}, + redact=True, + ) + params = utils.remove_empties(params) + + facts["ospfv3"] = params.get("config", []) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/prefix_lists/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/prefix_lists/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/prefix_lists/prefix_lists.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/prefix_lists/prefix_lists.py new file mode 100644 index 000000000..aa1f81b84 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/prefix_lists/prefix_lists.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos prefix_lists fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.prefix_lists.prefix_lists import ( + Prefix_listsArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.prefix_lists import ( + Prefix_listsTemplate, +) + + +class Prefix_listsFacts(object): + """The eos prefix_lists facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Prefix_listsArgs.argument_spec + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section prefix-list") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Prefix_lists network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + + if not data: + data = self.get_config(connection) + + # parse native config using the Prefix_lists template + prefix_lists_parser = Prefix_listsTemplate( + lines=data.splitlines(), + module=self._module, + ) + objs = prefix_lists_parser.parse() + if objs: + for afi, pl in iteritems(objs): + if "prefix_lists" in pl: + pl["prefix_lists"] = sorted( + list(pl["prefix_lists"].values()), + key=lambda k, sk="name": k[sk], + ) + for plist in pl["prefix_lists"]: + for en in plist: + if "entries" in en: + plist["entries"] = sorted( + list(plist["entries"].values()), + key=lambda k, sk="sequence": k[sk], + ) + objs = sorted(list(objs.values()), key=lambda k, sk="afi": k[sk]) + else: + objs = [] + ansible_facts["ansible_network_resources"].pop("prefix_lists", None) + + params = utils.remove_empties( + prefix_lists_parser.validate_config( + self.argument_spec, + {"config": objs}, + redact=True, + ), + ) + + facts["prefix_lists"] = params.get("config", []) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/route_maps/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/route_maps/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/route_maps/route_maps.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/route_maps/route_maps.py new file mode 100644 index 000000000..e5ca11162 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/route_maps/route_maps.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos route_maps fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +import re + +from copy import deepcopy + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.route_maps.route_maps import ( + Route_mapsArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.route_maps import ( + Route_mapsTemplate, +) + + +class Route_mapsFacts(object): + """The eos route_maps facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Route_mapsArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section route-map ") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Route_maps network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = [] + + if not data: + data = self.get_config(connection) + + resource_delim = "route-map" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + # parse native config using the Ospf_interfaces template + route_maps_facts = [] + # parse native config using the Route_maps template + for resource in resources: + route_maps_parser = Route_mapsTemplate(lines=resource.splitlines()) + objs = route_maps_parser.parse() + if objs: + dict_update = {} + for k, v in iteritems(objs): + if k == "entries": + e_list = [] + match_dict = {} + match_ip = {} + match_ipv6 = {} + set_dict = {} + for el in v: + for entry_k, entry_v in iteritems(el): + if entry_k == "match": + if "ip" in entry_v or "ipv6" in entry_v: + for ipk, ipv in iteritems(entry_v): + if "ip" in entry_v: + match_ip.update(ipv) + if "ipv6" in entry_v: + match_ipv6.update(ipv) + matchv = { + "ip": match_ip, + "ipv6": match_ipv6, + } + else: + matchv = entry_v + match_dict.update(matchv) + elif entry_k == "set": + set_dict.update(entry_v) + else: + dict_update.update(el) + dict_update.update( + {"match": match_dict, "set": set_dict}, + ) + e_list.append(dict_update) + objs.update({"entries": e_list}) + route_maps_facts.append(objs) + maps = [] + r_facts = [] + for r_map in route_maps_facts: + if r_map["route_map"] in maps: + for r_f in r_facts: + if r_f["route_map"] == r_map["route_map"]: + r_f["entries"].extend(r_map["entries"]) + else: + maps.append(r_map["route_map"]) + r_facts.append(r_map) + ansible_facts["ansible_network_resources"].pop("route_maps", None) + facts = {"route_maps": []} + params = utils.remove_empties( + utils.validate_config(self.argument_spec, {"config": r_facts}), + ) + if params.get("config"): + for cfg in params["config"]: + facts["route_maps"].append(utils.remove_empties(cfg)) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/snmp_server/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/snmp_server/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/snmp_server/snmp_server.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/snmp_server/snmp_server.py new file mode 100644 index 000000000..3746be94c --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/snmp_server/snmp_server.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The eos snmp_server fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.snmp_server.snmp_server import ( + Snmp_serverArgs, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.rm_templates.snmp_server import ( + Snmp_serverTemplate, +) + + +class Snmp_serverFacts(object): + """The eos snmp_server facts class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Snmp_serverArgs.argument_spec + + def get_config(self, connection): + """Wrapper method for `connection.get()` + This method exists solely to allow the unit test framework to mock device connection calls. + """ + return connection.get("show running-config | section snmp-server") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for Snmp_server network resource + + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + + :rtype: dictionary + :returns: facts + """ + facts = {} + objs = [] + + if not data: + data = self.get_config(connection) + + # parse native config using the Snmp_server template + snmp_server_parser = Snmp_serverTemplate( + lines=data.splitlines(), + module=self._module, + ) + objs = snmp_server_parser.parse() + if objs: + if "communities" in objs: + objs["communities"] = sorted( + list(objs["communities"].values()), + key=lambda k, sk="name": k[sk], + ) + if "groups" in objs: + objs["groups"] = sorted( + list(objs["groups"].values()), + key=lambda k, sk="group": k[sk], + ) + if "hosts" in objs: + objs["hosts"] = sorted( + list(objs["hosts"].values()), + key=lambda k, sk="host": k[sk], + ) + if "acls" in objs: + objs["acls"] = sorted( + list(objs["acls"].values()), + key=lambda k, sk="afi": k[sk], + ) + if "users" in objs: + objs["users"] = sorted( + list(objs["users"].values()), + key=lambda k, sk="user": k[sk], + ) + if "views" in objs: + objs["views"] = sorted( + list(objs["views"].values()), + key=lambda k, sk="view": k[sk], + ) + if "vrfs" in objs: + objs["vrfs"] = sorted( + list(objs["vrfs"].values()), + key=lambda k, sk="vrf": k[sk], + ) + else: + objs = {} + + ansible_facts["ansible_network_resources"].pop("snmp_server", None) + + params = utils.remove_empties( + snmp_server_parser.validate_config( + self.argument_spec, + {"config": objs}, + redact=True, + ), + ) + + facts["snmp_server"] = params.get("config", {}) + ansible_facts["ansible_network_resources"].update(facts) + + return ansible_facts diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/static_routes/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/static_routes/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/static_routes/static_routes.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/static_routes/static_routes.py new file mode 100644 index 000000000..85b0e7475 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/static_routes/static_routes.py @@ -0,0 +1,243 @@ +# +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos static_routes fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.static_routes.static_routes import ( + Static_routesArgs, +) + + +class Static_routesFacts(object): + """The eos static_routes fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = Static_routesArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def get_device_data(self, connection): + return connection.get("show running-config | grep route") + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for static_routes + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + if not data: + data = self.get_device_data(connection) + + # split the config into instances of the resource + resource_delim = "ip.* route" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [p.strip() for p in re.findall(find_pattern, data)] + resources_without_vrf = [] + resource_vrf = {} + for resource in resources: + if resource and "vrf" not in resource: + resources_without_vrf.append(resource) + else: + vrf = re.search(r"ip(v6)* route vrf (.*?) .*", resource) + if vrf.group(2) in resource_vrf.keys(): + vrf_val = resource_vrf[vrf.group(2)] + vrf_val.append(resource) + resource_vrf.update({vrf.group(2): vrf_val}) + else: + resource_vrf.update({vrf.group(2): [resource]}) + resources_without_vrf = ["\n".join(resources_without_vrf)] + for vrf in resource_vrf.keys(): + vrflist = ["\n".join(resource_vrf[vrf])] + resource_vrf.update({vrf: vrflist}) + objs = [] + for resource in resources_without_vrf: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.append(obj) + for resource in resource_vrf.keys(): + if resource: + obj = self.render_config( + self.generated_spec, + resource_vrf[resource][0], + ) + if obj: + objs.append(obj) + ansible_facts["ansible_network_resources"].pop("static_routes", None) + facts = {} + if objs: + facts["static_routes"] = [] + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + for cfg in params["config"]: + facts["static_routes"].append(utils.remove_empties(cfg)) + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + address_family_dict = {} + route_dict = {} + dest_list = [] + afi_list = [] + vrf_list = [] + routes = [] + config["address_families"] = [] + next_hops = {} + interface_list = [ + "Ethernet", + "Loopback", + "Management", + "Port-Channel", + "Tunnel", + "Vlan", + "Vxlan", + "vtep", + ] + conf_list = conf.split("\n") + for conf_elem in conf_list: + matches = re.findall( + r"(ip|ipv6) route ([\d\.\/:]+|vrf) (.+)$", + conf_elem, + ) + if matches: + remainder = matches[0][2].split() + route_update = False + if matches[0][1] == "vrf": + vrf = remainder.pop(0) + # new vrf + if vrf not in vrf_list and vrf_list: + route_dict.update({"next_hops": next_hops}) + routes.append(route_dict) + address_family_dict.update({"routes": routes}) + config["address_families"].append(address_family_dict) + route_update = True + config.update({"vrf": vrf}) + vrf_list.append(vrf) + dest = remainder.pop(0) + else: + config["vrf"] = None + dest = matches[0][1] + afi = "ipv4" if matches[0][0] == "ip" else "ipv6" + if afi not in afi_list: + if afi_list and not route_update: + # new afi and not the first updating all prev configs + route_dict.update({"next_hops": next_hops}) + routes.append(route_dict) + address_family_dict.update({"routes": routes}) + config["address_families"].append(address_family_dict) + route_update = True + address_family_dict = {} + address_family_dict.update({"afi": afi}) + routes = [] + afi_list.append(afi) + # To check the format of the dest + prefix = re.search(r"/", dest) + if not prefix: + dest = dest + " " + remainder.pop(0) + if dest not in dest_list: + # For new dest and not the first dest + if dest_list and not route_update: + route_dict.update({"next_hops": next_hops}) + routes.append(route_dict) + dest_list.append(dest) + next_hops = [] + route_dict = {} + route_dict.update({"dest": dest}) + nexthops = {} + nxthop_addr = re.search(r"[\.\:]", remainder[0]) + if nxthop_addr: + nexthops.update({"interface": remainder.pop(0)}) + if remainder and remainder[0] == "label": + nexthops.update({"mpls_label": remainder.pop(1)}) + remainder.pop(0) + elif re.search(r"Nexthop-Group", remainder[0], re.IGNORECASE): + nexthops.update({"nexthop_grp": remainder.pop(1)}) + remainder.pop(0) + else: + interface = remainder.pop(0) + if interface in interface_list: + interface = interface + " " + remainder.pop(0) + nexthops.update({"interface": interface}) + for attribute in remainder: + forward_addr = re.search( + r"([\dA-Fa-f]+[:\.]+)+[\dA-Fa-f]+", + attribute, + ) + if forward_addr: + nexthops.update( + { + "forward_router_address": remainder.pop( + remainder.index(attribute), + ), + }, + ) + for attribute in remainder: + for params in ["tag", "name", "track"]: + if attribute == params: + keyname = params + if attribute == "name": + keyname = "description" + nexthops.update( + { + keyname: remainder.pop( + remainder.index(attribute) + 1, + ), + }, + ) + remainder.pop(remainder.index(attribute)) + if remainder: + metric = re.search(r"\d+", remainder[0]) + if metric: + nexthops.update({"admin_distance": remainder.pop(0)}) + next_hops.append(nexthops) + route_dict.update({"next_hops": next_hops}) + routes.append(route_dict) + address_family_dict.update({"routes": routes}) + config["address_families"].append(address_family_dict) + return utils.remove_empties(config) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/vlans/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/vlans/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/vlans/vlans.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/vlans/vlans.py new file mode 100644 index 000000000..876891253 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/facts/vlans/vlans.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +""" +The eos vlans fact class +It is in this file the configuration is collected from the device +for a given resource, parsed, and the facts tree is populated +based on the configuration. +""" + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +import re + +from copy import deepcopy + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import ( + utils, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.vlans.vlans import ( + VlansArgs, +) + + +class VlansFacts(object): + """The eos vlans fact class""" + + def __init__(self, module, subspec="config", options="options"): + self._module = module + self.argument_spec = VlansArgs.argument_spec + spec = deepcopy(self.argument_spec) + if subspec: + if options: + facts_argument_spec = spec[subspec][options] + else: + facts_argument_spec = spec[subspec] + else: + facts_argument_spec = spec + + self.generated_spec = utils.generate_dict(facts_argument_spec) + + def populate_facts(self, connection, ansible_facts, data=None): + """Populate the facts for vlans + :param connection: the device connection + :param ansible_facts: Facts dictionary + :param data: previously collected conf + :rtype: dictionary + :returns: facts + """ + if not data: + data = connection.get("show running-config | section ^vlan") + + # split the config into instances of the resource + resource_delim = "vlan" + find_pattern = r"(?:^|\n)%s.*?(?=(?:^|\n)%s|$)" % ( + resource_delim, + resource_delim, + ) + resources = [ + p.strip() for p in re.findall(find_pattern, data, re.DOTALL) + ] + + objs = [] + for resource in resources: + if resource: + obj = self.render_config(self.generated_spec, resource) + if obj: + objs.extend(obj) + + ansible_facts["ansible_network_resources"].pop("vlans", None) + facts = {} + if objs: + params = utils.validate_config( + self.argument_spec, + {"config": objs}, + ) + facts["vlans"] = [ + utils.remove_empties(cfg) for cfg in params["config"] + ] + + ansible_facts["ansible_network_resources"].update(facts) + return ansible_facts + + def render_config(self, spec, conf): + """ + Render config as dictionary structure and delete keys + from spec for null values + + :param spec: The facts tree, generated from the argspec + :param conf: The configuration + :rtype: dictionary + :returns: The generated config + """ + config = deepcopy(spec) + vlans = [] + + parse_result = utils.parse_conf_arg(conf, "vlan") + if not parse_result.split(" ")[0].isalpha(): + vlan_list = vlan_to_list(parse_result) + for vlan in vlan_list: + config["vlan_id"] = vlan + config["name"] = utils.parse_conf_arg(conf, "name") + config["state"] = utils.parse_conf_arg(conf, "state") + if config["state"] is None: + config["state"] = "active" + vlans.append(utils.remove_empties(config)) + + return vlans + + +def vlan_to_list(vlan_str): + vlans = [] + for vlan in vlan_str.split(","): + if "-" in vlan: + start, stop = vlan.split("-") + vlans.extend(range(int(start), int(stop) + 1)) + else: + vlans.append(int(vlan)) + + return vlans diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/address_family.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/address_family.py new file mode 100644 index 000000000..dcbf45a4a --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/address_family.py @@ -0,0 +1,149 @@ +# +# (c) 2019, Ansible by Red Hat, inc +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type +import re + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.providers.cli.config.bgp.neighbors import ( + AFNeighbors, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.providers.providers import ( + CliProvider, +) + + +class AddressFamily(CliProvider): + def render(self, config=None): + commands = list() + safe_list = list() + + router_context = "router bgp %s" % self.get_value("config.bgp_as") + context_config = None + + for item in self.get_value("config.address_family"): + context = "address-family %s" % item["afi"] + context_commands = list() + + if config: + context_path = [router_context, context] + context_config = self.get_config_context( + config, + context_path, + indent=2, + ) + + for key, value in iteritems(item): + if value is not None: + meth = getattr(self, "_render_%s" % key, None) + if meth: + resp = meth(item, context_config) + if resp: + context_commands.extend(to_list(resp)) + + if context_commands: + commands.append(context) + commands.extend(context_commands) + commands.append("exit") + + safe_list.append(context) + + if self.params["operation"] == "replace": + if config: + resp = self._negate_config(config, safe_list) + commands.extend(resp) + + return commands + + def _negate_config(self, config, safe_list=None): + commands = list() + matches = re.findall(r"(address-family .+)$", config, re.M) + for item in set(matches).difference(safe_list): + commands.append("no %s" % item) + return commands + + def _render_auto_summary(self, item, config=None): + cmd = "auto-summary" + if item["auto_summary"] is False: + cmd = "no %s" % cmd + if not config or cmd not in config: + return cmd + + def _render_synchronization(self, item, config=None): + cmd = "synchronization" + if item["synchronization"] is False: + cmd = "no %s" % cmd + if not config or cmd not in config: + return cmd + + def _render_networks(self, item, config=None): + commands = list() + safe_list = list() + + for entry in item["networks"]: + network = entry["prefix"] + if entry["masklen"]: + network = "%s/%s" % (entry["prefix"], entry["masklen"]) + safe_list.append(network) + + cmd = "network %s" % network + + if entry["route_map"]: + cmd += " route-map %s" % entry["route_map"] + + if not config or cmd not in config: + commands.append(cmd) + + if self.params["operation"] == "replace": + if config: + matches = re.findall(r"network (\S+)", config, re.M) + for entry in set(matches).difference(safe_list): + commands.append("no network %s" % entry) + + return commands + + def _render_redistribute(self, item, config=None): + commands = list() + safe_list = list() + + for entry in item["redistribute"]: + option = entry["protocol"] + + cmd = "redistribute %s" % entry["protocol"] + + if entry["route_map"]: + cmd += " route-map %s" % entry["route_map"] + + if not config or cmd not in config: + commands.append(cmd) + + safe_list.append(option) + + if self.params["operation"] == "replace": + if config: + matches = re.findall( + r"redistribute (\S+)(?:\s*)(\d*)", + config, + re.M, + ) + for i in range(0, len(matches)): + matches[i] = " ".join(matches[i]).strip() + for entry in set(matches).difference(safe_list): + commands.append("no redistribute %s" % entry) + + return commands + + def _render_neighbors(self, item, config): + """generate bgp neighbor configuration""" + return AFNeighbors(self.params).render( + config, + nbr_list=item["neighbors"], + ) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/neighbors.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/neighbors.py new file mode 100644 index 000000000..760827a93 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/neighbors.py @@ -0,0 +1,194 @@ +# +# (c) 2019, Ansible by Red Hat, inc +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type +import re + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.providers.providers import ( + CliProvider, +) + + +class Neighbors(CliProvider): + def render(self, config=None, nbr_list=None): + commands = list() + safe_list = list() + if not nbr_list: + nbr_list = self.get_value("config.neighbors") + + for item in nbr_list: + neighbor_commands = list() + context = "neighbor %s" % item["neighbor"] + cmd = "%s remote-as %s" % (context, item["remote_as"]) + + if not config or cmd not in config: + neighbor_commands.append(cmd) + + for key, value in iteritems(item): + if value is not None: + meth = getattr(self, "_render_%s" % key, None) + if meth: + resp = meth(item, config) + if resp: + neighbor_commands.extend(to_list(resp)) + commands.extend(neighbor_commands) + safe_list.append(context) + + if self.params["operation"] == "replace": + if config and safe_list: + commands.extend(self._negate_config(config, safe_list)) + + return commands + + def _negate_config(self, config, safe_list=None): + commands = list() + matches = re.findall(r"(neighbor \S+)", config, re.M) + for item in set(matches).difference(safe_list): + commands.append("no %s" % item) + return commands + + def _render_description(self, item, config=None): + cmd = "neighbor %s description %s" % ( + item["neighbor"], + item["description"], + ) + if not config or cmd not in config: + return cmd + + def _render_enabled(self, item, config=None): + cmd = "neighbor %s shutdown" % item["neighbor"] + if item["enabled"] is True: + if not config or cmd in config: + cmd = "no %s" % cmd + return cmd + elif not config or cmd not in config: + return cmd + + def _render_update_source(self, item, config=None): + cmd = "neighbor %s update-source %s" % ( + item["neighbor"], + item["update_source"], + ) + if not config or cmd not in config: + return cmd + + def _render_password(self, item, config=None): + cmd = "neighbor %s password %s" % (item["neighbor"], item["password"]) + if not config or cmd not in config: + return cmd + + def _render_ebgp_multihop(self, item, config=None): + cmd = "neighbor %s ebgp-multihop %s" % ( + item["neighbor"], + item["ebgp_multihop"], + ) + if not config or cmd not in config: + return cmd + + def _render_peer_group(self, item, config=None): + cmd = "neighbor %s peer group %s" % ( + item["neighbor"], + item["peer_group"], + ) + if not config or cmd not in config: + return cmd + + def _render_route_reflector_client(self, item, config=None): + cmd = "neighbor %s route-reflector-client" % item["neighbor"] + if item["route_reflector_client"] is False: + if not config or cmd in config: + cmd = "no %s" % cmd + return cmd + elif not config or cmd not in config: + return cmd + + def _render_maximum_prefix(self, item, config=None): + cmd = "neighbor %s maximum-routes %s" % ( + item["neighbor"], + item["maximum_prefix"], + ) + if not config or cmd not in config: + return cmd + + def _render_remove_private_as(self, item, config=None): + cmd = "neighbor %s remove-private-AS" % item["neighbor"] + if item["remove_private_as"] is False: + if not config or cmd in config: + cmd = "no %s" % cmd + return cmd + elif not config or cmd not in config: + return cmd + + def _render_timers(self, item, config): + """generate bgp timer related configuration""" + keepalive = item["timers"]["keepalive"] + holdtime = item["timers"]["holdtime"] + neighbor = item["neighbor"] + + if keepalive and holdtime: + cmd = "neighbor %s timers %s %s" % (neighbor, keepalive, holdtime) + if not config or cmd not in config: + return cmd + + +class AFNeighbors(CliProvider): + def render(self, config=None, nbr_list=None): + commands = list() + if not nbr_list: + return + + for item in nbr_list: + neighbor_commands = list() + for key, value in iteritems(item): + if value is not None: + meth = getattr(self, "_render_%s" % key, None) + if meth: + resp = meth(item, config) + if resp: + neighbor_commands.extend(to_list(resp)) + + commands.extend(neighbor_commands) + + return commands + + def _render_activate(self, item, config=None): + cmd = "neighbor %s activate" % item["neighbor"] + if item["activate"] is False: + if not config or cmd in config: + cmd = "no %s" % cmd + return cmd + elif not config or cmd not in config: + return cmd + + def _render_default_originate(self, item, config=None): + cmd = "neighbor %s default-originate" % item["neighbor"] + if item["default_originate"] is False: + if not config or cmd in config: + cmd = "no %s" % cmd + return cmd + elif not config or cmd not in config: + return cmd + + def _render_graceful_restart(self, item, config=None): + cmd = "neighbor %s graceful-restart" % item["neighbor"] + if item["graceful_restart"] is False: + cmd = "no " + cmd + if config: + config_el = [x.strip() for x in config.split("\n")] + if cmd in config_el: + return + return cmd + + def _render_weight(self, item, config=None): + cmd = "neighbor %s weight %s" % (item["neighbor"], item["weight"]) + if not config or cmd not in config: + return cmd diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/process.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/process.py new file mode 100644 index 000000000..79cecb29c --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/cli/config/bgp/process.py @@ -0,0 +1,186 @@ +# +# (c) 2019, Ansible by Red Hat, inc +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type +import re + +from ansible.module_utils.six import iteritems +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, +) + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.providers.cli.config.bgp.address_family import ( + AddressFamily, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.providers.cli.config.bgp.neighbors import ( + Neighbors, +) +from ansible_collections.arista.eos.plugins.module_utils.network.eos.providers.providers import ( + CliProvider, + register_provider, +) + + +REDISTRIBUTE_PROTOCOLS = frozenset( + ["ospf", "ospfv3", "rip", "isis", "static", "connected"], +) + + +@register_provider("eos", "eos_bgp") +class Provider(CliProvider): + def render(self, config=None): + commands = list() + + existing_as = None + if config: + match = re.search(r"router bgp (\d+)", config, re.M) + if match: + existing_as = match.group(1) + + operation = self.params["operation"] + + context = None + if self.params["config"]: + context = "router bgp %s" % self.get_value("config.bgp_as") + + if operation == "delete": + if existing_as: + commands.append("no router bgp %s" % existing_as) + elif context: + commands.append("no %s" % context) + + else: + self._validate_input(config) + if operation == "replace": + if existing_as and int(existing_as) != self.get_value( + "config.bgp_as", + ): + commands.append("no router bgp %s" % existing_as) + config = None + + elif operation == "override": + if existing_as: + commands.append("no router bgp %s" % existing_as) + config = None + + context_commands = list() + + for key, value in iteritems(self.get_value("config")): + if value is not None: + meth = getattr(self, "_render_%s" % key, None) + if meth: + resp = meth(config) + if resp: + context_commands.extend(to_list(resp)) + + if context and context_commands: + commands.append(context) + commands.extend(context_commands) + commands.append("exit") + return commands + + def _render_router_id(self, config=None): + cmd = "router-id %s" % self.get_value("config.router_id") + if not config or cmd not in config: + return cmd + + def _render_log_neighbor_changes(self, config=None): + cmd = "bgp log-neighbor-changes" + log_neighbor_changes = self.get_value("config.log_neighbor_changes") + if log_neighbor_changes is True: + if not config or cmd not in config: + return cmd + elif log_neighbor_changes is False: + if config and cmd in config: + return "no %s" % cmd + + def _render_networks(self, config=None): + commands = list() + safe_list = list() + + for entry in self.get_value("config.networks"): + network = entry["prefix"] + if entry["masklen"]: + network = "%s/%s" % (entry["prefix"], entry["masklen"]) + safe_list.append(network) + + cmd = "network %s" % network + + if entry["route_map"]: + cmd += " route-map %s" % entry["route_map"] + + if not config or cmd not in config: + commands.append(cmd) + + if self.params["operation"] == "replace": + if config: + matches = re.findall(r"network (\S+)", config, re.M) + for entry in set(matches).difference(safe_list): + commands.append("no network %s" % entry) + + return commands + + def _render_redistribute(self, config=None): + commands = list() + safe_list = list() + + for entry in self.get_value("config.redistribute"): + option = entry["protocol"] + + cmd = "redistribute %s" % entry["protocol"] + + if entry["route_map"]: + cmd += " route-map %s" % entry["route_map"] + + if not config or cmd not in config: + commands.append(cmd) + + safe_list.append(option) + + if self.params["operation"] == "replace": + if config: + matches = re.findall( + r"redistribute (\S+)(?:\s*)(\d*)", + config, + re.M, + ) + for i in range(0, len(matches)): + matches[i] = " ".join(matches[i]).strip() + for entry in set(matches).difference(safe_list): + commands.append("no redistribute %s" % entry) + + return commands + + def _render_neighbors(self, config): + """generate bgp neighbor configuration""" + return Neighbors(self.params).render(config) + + def _render_address_family(self, config): + """generate address-family configuration""" + return AddressFamily(self.params).render(config) + + def _validate_input(self, config): + def device_has_AF(config): + return re.search(r"address-family (?:.*)", config) + + address_family = self.get_value("config.address_family") + root_networks = self.get_value("config.networks") + operation = self.params["operation"] + + if operation == "replace" and root_networks: + if address_family: + for item in address_family: + if item["networks"]: + raise ValueError( + "operation is replace but provided both root level networks and networks under %s address family" + % item["afi"], + ) + + if config and device_has_AF(config): + raise ValueError( + "operation is replace and device has one or more address family activated but root level network(s) provided", + ) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/module.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/module.py new file mode 100644 index 000000000..12d606b70 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/module.py @@ -0,0 +1,75 @@ +# +# (c) 2019, Ansible by Red Hat, inc +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type +from ansible.module_utils._text import to_text +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.connection import Connection + +from ansible_collections.arista.eos.plugins.module_utils.network.eos.providers import ( + providers, +) + + +class NetworkModule(AnsibleModule): + fail_on_missing_provider = True + + def __init__(self, connection=None, *args, **kwargs): + super(NetworkModule, self).__init__(*args, **kwargs) + + if connection is None: + connection = Connection(self._socket_path) + + self.connection = connection + + @property + def provider(self): + if not hasattr(self, "_provider"): + capabilities = self.from_json(self.connection.get_capabilities()) + + network_os = capabilities["device_info"]["network_os"] + network_api = capabilities["network_api"] + + if network_api == "cliconf": + connection_type = "network_cli" + + cls = providers.get( + network_os, + self._name.split(".")[-1], + connection_type, + ) + + if not cls: + msg = ( + "unable to find suitable provider for network os %s" + % network_os + ) + if self.fail_on_missing_provider: + self.fail_json(msg=msg) + else: + self.warn(msg) + + obj = cls(self.params, self.connection, self.check_mode) + + setattr(self, "_provider", obj) + + return getattr(self, "_provider") + + def get_facts(self, subset=None): + try: + self.provider.get_facts(subset) + except Exception as exc: + self.fail_json(msg=to_text(exc)) + + def edit_config(self, config_filter=None): + current_config = self.connection.get_config(flags=config_filter) + try: + commands = self.provider.edit_config(current_config) + changed = bool(commands) + return {"commands": commands, "changed": changed} + except Exception as exc: + self.fail_json(msg=to_text(exc)) diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/providers.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/providers.py new file mode 100644 index 000000000..31adec628 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/providers/providers.py @@ -0,0 +1,127 @@ +# +# (c) 2019, Ansible by Red Hat, inc +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type +import json + +from threading import RLock + +from ansible.module_utils.six import itervalues +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.config import ( + NetworkConfig, +) +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( + to_list, +) + + +_registered_providers = {} +_provider_lock = RLock() + + +def register_provider(network_os, module_name): + def wrapper(cls): + _provider_lock.acquire() + try: + if network_os not in _registered_providers: + _registered_providers[network_os] = {} + for ct in cls.supported_connections: + if ct not in _registered_providers[network_os]: + _registered_providers[network_os][ct] = {} + for item in to_list(module_name): + for entry in itervalues(_registered_providers[network_os]): + entry[item] = cls + finally: + _provider_lock.release() + return cls + + return wrapper + + +def get(network_os, module_name, connection_type): + network_os_providers = _registered_providers.get(network_os) + if network_os_providers is None: + raise ValueError("unable to find a suitable provider for this module") + if connection_type not in network_os_providers: + raise ValueError("provider does not support this connection type") + elif module_name not in network_os_providers[connection_type]: + raise ValueError("could not find a suitable provider for this module") + return network_os_providers[connection_type][module_name] + + +class ProviderBase(object): + supported_connections = () + + def __init__(self, params, connection=None, check_mode=False): + self.params = params + self.connection = connection + self.check_mode = check_mode + + @property + def capabilities(self): + if not hasattr(self, "_capabilities"): + resp = self.from_json(self.connection.get_capabilities()) + setattr(self, "_capabilities", resp) + return getattr(self, "_capabilities") + + def get_value(self, path): + params = self.params.copy() + for key in path.split("."): + params = params[key] + return params + + def get_facts(self, subset=None): + raise NotImplementedError(self.__class__.__name__) + + def edit_config(self): + raise NotImplementedError(self.__class__.__name__) + + +class CliProvider(ProviderBase): + supported_connections = ("network_cli",) + + @property + def capabilities(self): + if not hasattr(self, "_capabilities"): + resp = self.from_json(self.connection.get_capabilities()) + setattr(self, "_capabilities", resp) + return getattr(self, "_capabilities") + + def get_config_context(self, config, path, indent=2): + if config is not None: + netcfg = NetworkConfig(indent=indent, contents=config) + try: + config = netcfg.get_block_config(to_list(path)) + except ValueError: + config = None + return config + + def render(self, config=None): + raise NotImplementedError(self.__class__.__name__) + + def cli(self, command): + try: + if not hasattr(self, "_command_output"): + setattr(self, "_command_output", {}) + return self._command_output[command] + except KeyError: + out = self.connection.get(command) + try: + out = json.loads(out) + except ValueError: + pass + self._command_output[command] = out + return out + + def get_facts(self, subset=None): + return self.populate() + + def edit_config(self, config=None): + commands = self.render(config) + if commands and self.check_mode is False: + self.connection.edit_config(commands) + return commands diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/__init__.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_address_family.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_address_family.py new file mode 100644 index 000000000..555ffd30e --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_address_family.py @@ -0,0 +1,672 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The Bgp_global parser templates file. This contains +a list of parser definitions and associated functions that +facilitates both facts gathering and native command generation for +the given network resource. +""" + +import re + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import ( + NetworkTemplate, +) + + +def _tmplt_router_bgp_cmd(config_data): + command = "router bgp {as_number}".format(**config_data) + return command + + +def _tmplt_bgp_address_family(config_data): + command = "" + if config_data.get("vrf"): + command = "vrf {vrf}\n".format(**config_data) + command += "address-family {afi}".format(**config_data) + if config_data.get("safi"): + command += " {safi}".format(**config_data) + return command + + +def _tmplt_bgp_params(config_data): + command = "bgp" + if config_data["bgp_params"].get("additional_paths"): + command += " additional-paths {additional_paths}".format( + **config_data["bgp_params"] + ) + if config_data["bgp_params"]["additional_paths"] == "send": + command += " any" + elif config_data["bgp_params"].get("next_hop_address_family"): + command += " next-hop address-family ipv6" + elif config_data["bgp_params"].get("next_hop_unchanged"): + command += " next-hop-unchanged" + elif config_data["bgp_params"].get("redistribute_internal"): + command += " redistribute-internal" + elif config_data["bgp_params"].get("route"): + command += " route install-map {route}".format( + **config_data["bgp_params"] + ) + return command + + +def _tmplt_bgp_graceful_restart(config_data): + command = "graceful-restart" + return command + + +def _tmplt_bgp_neighbor(config_data): + command = "neighbor {peer}".format(**config_data["neighbor"]) + if config_data["neighbor"].get("additional_paths"): + command += " additional-paths {additional_paths}".format( + **config_data["neighbor"] + ) + if config_data["neighbor"]["additional_paths"] == "send": + command += "any" + elif config_data["neighbor"].get("activate"): + command += " activate" + elif config_data["neighbor"].get("default_originate"): + command += " default-originate" + if config_data["neighbor"]["default_originate"].get("route_map"): + command += " route-map {route_map}".format( + **config_data["neighbor"]["default_originate"] + ) + if config_data["neighbor"]["default_originate"].get("always"): + command += " always" + elif config_data["neighbor"].get("graceful_restart"): + command += " graceful-restart" + elif config_data["neighbor"].get("next_hop_unchanged"): + command += " next-hop-unchanged" + elif config_data["neighbor"].get("next_hop_address_family"): + command += " next-hop addres-family ipv6" + elif config_data["neighbor"].get("prefix_list"): + command += " prefix-list {name} {direction}".format( + **config_data["neighbor"]["prefix_list"] + ) + elif config_data["neighbor"].get("route_map"): + command += " route-map {name} {direction}".format( + **config_data["neighbor"]["route_map"] + ) + elif config_data["neighbor"].get("weight"): + command += " weight {weight}".format(**config_data["neighbor"]) + elif config_data["neighbor"].get("encapsulation"): + command += " encapsulation {transport}".format( + **config_data["neighbor"] + ) + if config_data["neighbor"]["encapsulation"].get("source_interface"): + command += ( + " next-hop-self source-interface {source_interface}".format( + **config_data["neighbor"] + ) + ) + return command + + +def _tmplt_bgp_network(config_data): + command = "network {address}".format(**config_data) + if config_data.get("route_map"): + command += " route-map {route_map}".format(**config_data) + return command + + +def _tmplt_bgp_redistribute(config_data): + command = "redistribute {protocol}".format(**config_data) + if config_data.get("isis_level"): + command += " {isis_level}".format(**config_data) + if config_data.get("ospf_route"): + command += " match {ospf_route}".format(**config_data) + if config_data.get("route_map"): + command += " route-map {route_map}".format(**config_data) + return command + + +def _tmplt_bgp_route_target(config_data): + command = "route-target {action}".format(**config_data["route_target"]) + if config_data["route_target"].get("type"): + command += " {type}".format(**config_data["route_target"]) + if config_data["route_target"].get("route_map"): + command += " {route_map}".format(**config_data["route_target"]) + if config_data["route_target"].get("target"): + command += " {target}".format(**config_data["route_target"]) + return command + + +class Bgp_afTemplate(NetworkTemplate): + def __init__(self, lines=None): + super(Bgp_afTemplate, self).__init__(lines=lines, tmplt=self) + + # fmt: off + PARSERS = [ + { + "name": "router", + "getval": re.compile( + r""" + ^router\s + bgp + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": _tmplt_router_bgp_cmd, + "compval": "as_number", + "result": {"as_number": "{{ as_num }}"}, + "shared": True, + }, + { + "name": "address_family", + "getval": re.compile( + r""" + \s*(?Pvrf\s\S+)* + \s*address-family + \s(?Pipv4|ipv6|evpn) + \s*(?P\S+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_address_family, + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "afi": "{{ afi }}", + "safi": "{{ type }}", + "vrf": "{{ vrf.split(" ")[1] }}", + }, + }, + }, + "shared": True, + }, + { + "name": "bgp_params_additional_paths", + "getval": re.compile( + r""" + \s*bgp + \s+additional-paths + \s+(?P\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.additional_paths", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "bgp_params": { + "additional_paths": "{{ action }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params.nexthop_address_family", + "getval": re.compile( + r""" + \s*bgp + \s+next-hop + \s+address-family + \s+ipv6 + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.next_hop_address_family", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "bgp_params": { + "next_hop_unchanged": "{{ 'ipv6' }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params.nexthop_unchanged", + "getval": re.compile( + r""" + \s*bgp + \s+next-hop-unchanged + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.next_hop_unchanged", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "bgp_params": { + "next_hop_unchanged": "{{ True }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params.redistribute_internal", + "getval": re.compile( + r""" + \s*bgp + \s+redistribute-internal + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.redistribute_internal", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "bgp_params": { + "redistribute_internal": "{{ True }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params.route", + "getval": re.compile( + r""" + \s*bgp + \s+route + \s+install-map + \s+(?P\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.route", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "bgp_params": { + "route": "{{ route }}", + }, + }, + }, + }, + }, + { + "name": "graceful_restart", + "getval": re.compile( + r""" + \s*graceful-restart + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_graceful_restart, + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "graceful_restart": "{{ True }}", + }, + }, + }, + }, + { + "name": "neighbor.activate", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+activate + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.activate", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "activate": "{{ True }}", + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.additional_paths", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+additional-paths + \s+(?P\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.additional_paths", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "additional_paths": "{{ action }}", + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.default_originate", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+default-originate + \s*(?Proute-map\s\S+)* + \s*(?Palways)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.default_originate", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "default_originate": { + "route_map": "{{ route_map.split(" ")[1] }}", + "always": "{{ True if always is defined }}", + }, + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.graceful_restart", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+graceful-restart + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.graceful_restart", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "graceful_restart": "{{ True }}", + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.next_hop_unchanged", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+next-hop-unchanged + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.next_hop_unchanged", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "next_hop_unchanged": "{{ True }}", + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.next_hop_address_family", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+next-hop + \s+address-family + \s+ipv6 + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.next_hop_address_family", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "next_hop_address_family": "{{ 'ipv6' }}", + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.prefix_list", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+prefix-list + \s+(?P\S+) + \s+(?Pin|out) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.prefix_list", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "prefix_list": { + "name": "{{ name }}", + "direction": "{{ dir }}", + }, + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.route_map", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+route-map + \s+(?P\S+) + \s+(?Pin|out) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.route_map", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "route_map": { + "name": "{{ name }}", + "direction": "{{ dir }}", + }, + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.weight", + "getval": re.compile( + r""" + \s*neighbor + \s+(?P\S+) + \s+weight + \s+(?P\d+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.weight", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "weight": "{{ weight }}", + }, + }, + }, + }, + }, + }, + { + "name": "neighbor.encapsulation", + "getval": re.compile( + r""" + \s*neighbor + \s+default + \s+encapsulation + \s+(?Pmpls|vxlan) + \s*(next-hop-self)* + \s*(source-interface)* + \s*(?P\S+\s\S+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_neighbor, + "compval": "neighbor.encapsulation", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "neighbor": { + "{{ peer }}": { + "peer": "{{ peer }}", + "encapsulation": { + "transport": "{{ type }}", + "source_interface": "{{ interface }}", + }, + }, + }, + }, + }, + }, + }, + { + "name": "network", + "getval": re.compile( + r""" + \s*network + \s+(?P
\S+) + \s*(route-map)* + \s*(?P\S+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_network, + "compval": "network", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "network": { + "{{ address }}": { + "address": "{{ address }}", + "route_map": "{{ route_map }}", + }, + }, + }, + }, + }, + }, + { + "name": "redistribute", + "getval": re.compile( + r""" + \s*redistribute + \s+(?P\S+) + \s*(?Plevel-1|level-2|level-1-2)* + \s*(?Pmatch\s\S+)* + \s*(?Proute-map\s\S+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_redistribute, + "compval": "redistribute", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "redistribute": [ + { + "protocol": "{{ route }}", + "route_map": "{{ route_map.split(" ")[1] }}", + "isis_level": "{{ level }}", + "ospf_route": "{{ match.split(" ")[1] }}", + }, + ], + }, + }, + }, + }, + { + "name": "route_target", + "getval": re.compile( + r""" + \s*route-target + \s+(?P\S+) + \s*(?Pevpn|vpn-ipv4|vpn-ipv6)* + \s*(?Proute-map\s\S+)* + \s+(?P\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_route_target, + "compval": "route_target", + "result": { + "address_family": { + '{{ afi + "_" + vrf|d() }}': { + "route_target": { + "action": "{{ action }}", + "type": "{{ type }}", + "route_map": "{{ map.split(" ")[1] }}", + "target": "{{ target }}", + }, + }, + }, + }, + }, + ] + # fmt: on diff --git a/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_global.py b/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_global.py new file mode 100644 index 000000000..a1fcee400 --- /dev/null +++ b/ansible_collections/arista/eos/plugins/module_utils/network/eos/rm_templates/bgp_global.py @@ -0,0 +1,2965 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + + +__metaclass__ = type + +""" +The Bgp_global parser templates file. This contains +a list of parser definitions and associated functions that +facilitates both facts gathering and native command generation for +the given network resource. +""" + +import re + +from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import ( + NetworkTemplate, +) + + +def _tmplt_router_bgp_cmd(config_data): + command = "router bgp {as_number}".format(**config_data) + return command + + +def _tmplt_bgp_vrf(config_data): + command = "vrf {vrf}".format(**config_data) + return command + + +def _tmplt_bgp_aggregate_address(config_data): + command = "aggregate-address {address}".format(**config_data) + if config_data.get("as_set"): + command += " as-set" + if config_data.get("summary_only"): + command += " summary-only" + if config_data.get("attribute_map"): + command += " attribute-map {attribute_map}".format(**config_data) + if config_data.get("match_map"): + command += " match-map {match_map}".format(**config_data) + if config_data.get("advertise_only"): + command += " advertise-only" + return command + + +def _tmplt_bgp_params(config_data): + command = "bgp" + if config_data["bgp_params"].get("additional_paths"): + command += ( + " additional-paths " + + config_data["bgp_params"]["additional_paths"] + ) + if config_data["bgp_params"]["additional_paths"] == "send": + command += " any" + elif config_data["bgp_params"].get("advertise_inactive"): + command += " advertise-inactive" + elif config_data["bgp_params"].get("allowas_in"): + command += " allowas-in" + if config_data["bgp_params"]["allowas_in"].get("count"): + command += " {count}".format( + **config_data["bgp_params"]["allowas_in"] + ) + elif config_data["bgp_params"].get("always_compare_med"): + command += " always-comapre-med" + elif config_data["bgp_params"].get("asn"): + command += " asn notaion {asn}".format(**config_data["bgp_params"]) + elif config_data["bgp_params"].get("auto_local_addr"): + command += " auto-local-addr" + elif config_data["bgp_params"].get("bestpath"): + if config_data["bgp_params"]["bestpath"].get("as_path"): + command += " bestpath as-path {as_path}".format( + **config_data["bgp_params"]["bestpath"] + ) + elif config_data["bgp_params"]["bestpath"].get("ecmp_fast"): + command += " bestpath ecmp-fast" + elif config_data["bgp_params"]["bestpath"].get("med"): + command += " bestpath med" + if config_data["bgp_params"]["bestpath"]["med"].get("confed"): + command += " confed" + else: + command += " missing-as-worst" + elif config_data["bgp_params"]["bestpath"].get("skip"): + command += " bestpath skip next-hop igp-cost" + elif config_data["bgp_params"]["bestpath"].get("tie_break"): + tie = re.sub( + r"_", + r"-", + config_data["bgp_params"]["bestpath"]["tie_break"], + ) + command += " tie-break " + tie + elif config_data["bgp_params"].get("client_to_client"): + command += " client-to-client" + elif config_data["bgp_params"].get("cluster_id"): + command += " cluster-id {cluster_id}".format( + **config_data["bgp_params"] + ) + elif config_data["bgp_params"].get("confederation"): + command += " confederation" + if config_data["bgp_params"]["confederation"].get("identifier"): + command += " identifier {identifier}".format( + **config_data["bgp_params"]["confederation"] + ) + else: + command += " peers {peers}".format( + **config_data["bgp_params"]["confederation"] + ) + elif config_data["bgp_params"].get("control_plane_filter"): + command += " control-plane-filter default-allow" + elif config_data["bgp_params"].get("convergence"): + command += " convergence" + if config_data["bgp_params"]["convergence"].get("slow_peer"): + command += " slow-peer" + command += " time {time}".format( + **config_data["bgp_params"]["convergence"] + ) + elif config_data["bgp_params"].get("default"): + command += " default {default}".format(**config_data["bgp_params"]) + elif config_data["bgp_params"].get("enforce_first_as"): + command += " enforce-first-as" + elif config_data["bgp_params"].get("host_routes"): + command += " host-routes fib direct-install" + elif config_data["bgp_params"].get("labeled_unicast"): + command += " labeled-unicast rib {labeled_unicast}".format( + **config_data["bgp_params"] + ) + elif config_data["bgp_params"].get("listen"): + # from eos 4.23 , 'bgp listen limit ' is replaced by 'dynamic peer max'. + command = "dynamic peer max " + if config_data["bgp_params"]["listen"].get("limit"): + command += "{limit}".format(**config_data["bgp_params"]["listen"]) + else: + command += " range {address} peer group".format( + **config_data["bgp_params"]["listen"]["range"] + ) + if config_data["bgp_params"]["listen"]["range"]["peer_group"].get( + "peer_filter", + ): + command += " {name} peer-filter {peer_filter}".format( + **config_data["bgp_params"]["listen"]["range"][ + "peer_group" + ] + ) + else: + command += " {name} remote-as {remote_as}".format( + **config_data["bgp_params"]["listen"]["range"][ + "peer_group" + ] + ) + elif config_data["bgp_params"].get("log_neighbor_changes"): + command += " log-neighbor-changes" + elif config_data["bgp_params"].get("missing_policy"): + command += ( + " missing-policy direction {direction} action {action}".format( + **config_data["bgp_params"]["missing_policy"] + ) + ) + elif config_data["bgp_params"].get("monitoring"): + command += " monitoring" + elif config_data["bgp_params"].get("next_hop_unchanged"): + command += " next-hop-unchanged" + elif config_data["bgp_params"].get("redistribute_internal"): + command += " redistribute-internal" + elif config_data["bgp_params"].get("route"): + command += " route install-map {route}".format( + **config_data["bgp_params"] + ) + elif config_data["bgp_params"].get("route_reflector"): + command += " route-reflector preserve-attributes" + if config_data["bgp_params"]["route_reflector"].get("preserve"): + command += " always" + elif config_data["bgp_params"].get("transport"): + command += " transport listen-port {transport}".format( + **config_data["bgp_params"] + ) + return command + + +def _tmplt_bgp_redistribute(config_data): + command = "redistribute {protocol}".format(**config_data) + if config_data.get("isis_level"): + command += " {isis_level}".format(**config_data) + if config_data.get("ospf_route"): + if config_data["ospf_route"] == "nssa_external_2": + route = "nssa-external 2" + elif config_data["ospf_route"] == "nssa_external_1": + route = "nssa-external 1" + else: + route = config_data["ospf_route"] + command += " match " + route + if config_data.get("route_map"): + command += " route-map {route_map}".format(**config_data) + return command + + +def _tmplt_bgp_default_metric(config_data): + command = "default-metric {default_metric}".format(**config_data) + return command + + +def _tmplt_bgp_distance(config_data): + command = "distance bgp" + if config_data["distance"].get("external"): + command += " {external}".format(**config_data["distance"]) + if config_data["distance"].get("internal"): + command += " {internal}".format(**config_data["distance"]) + if config_data["distance"].get("local"): + command += " {local}".format(**config_data["distance"]) + return command + + +def _tmplt_bgp_graceful_restart(config_data): + command = "graceful-restart" + if config_data.get("restart_time"): + command += " restart-time {restart_time}".format(**config_data) + if config_data.get("stalepath_time"): + command += " stalepath-time {stalepath_time}".format(**config_data) + return command + + +def _tmplt_bgp_graceful_restart_helper(config_data): + command = "graceful-restart-helper" + return command + + +def _tmplt_bgp_access_group(config_data): + if config_data.get("afi") == "ipv4": + afi = "ip" + else: + afi = "ipv6" + command = afi + " access-group {acl_name}".format(**config_data) + if config_data.get("direction"): + command += " {direction}".format(**config_data) + return command + + +def _tmplt_bgp_maximum_paths(config_data): + command = "maximum-paths {max_equal_cost_paths}".format( + **config_data["maximum_paths"] + ) + if config_data["maximum_paths"].get("max_installed_ecmp_paths"): + command += " ecmp {max_installed_ecmp_paths}".format( + **config_data["maximum_paths"] + ) + return command + + +def _tmplt_bgp_monitoring(config_data): + cmd = "monitoring" + command = "" + if config_data.get("timestamp"): + command = cmd + " timestamp {timestamp}".format(**config_data) + if config_data.get("port"): + command = cmd + " port {port}".format(**config_data) + if config_data.get("received"): + command = cmd + " received routes {received}".format(**config_data) + if config_data.get("station"): + command = cmd + " station {station}".format(**config_data) + return command + + +def _tmplt_bgp_neighbor(config_data): + command = "neighbor {neighbor_address}".format(**config_data["neighbor"]) + if config_data["neighbor"].get("additional_paths"): + command += " additional-paths {additional_paths}".format( + **config_data["neighbor"] + ) + if config_data["neighbor"]["additional_paths"] == "send": + command += "any" + elif config_data["neighbor"].get("peer_group"): + command += " peer group" + if ( + config_data["neighbor"]["peer_group"] + != config_data["neighbor"]["peer_group"] + ): + command += config_data["neighbor"]["peer_group"] + elif config_data["neighbor"].get("allowas_in"): + command += " allowas-in" + if config_data["neighbor"]["allowas_in"].get("count"): + command += " {count}".format( + **config_data["neighbor"]["allowas_in"] + ) + elif config_data["neighbor"].get("auto_local_addr"): + command += " auto-local-addr" + elif config_data["neighbor"].get("bfd"): + command += " bfd" + if config_data["neighbor"]["bfd"] == "c_bit": + command += " c-bit" + elif config_data["neighbor"].get("default_originate"): + command += " default-originate" + if config_data["neighbor"]["default_originate"].get("route_map"): + command += " route-map {route_map}".format( + **config_data["neighbor"]["default_originate"] + ) + if config_data["neighbor"]["default_originate"].get("always"): + command += " always" + elif config_data["neighbor"].get("description"): + command += " description {description}".format( + **config_data["neighbor"] + ) + elif config_data["neighbor"].get("dont_capability_negotiate"): + command += " dont-capability-negotiate" + elif config_data["neighbor"].get("ebgp_multihop"): + command += " ebgp-multiphop" + if config_data["neighbor"]["ebgp_multihop"].get("ttl"): + command += " {ttl}".format( + **config_data["neighbor"]["ebgp_multihop"] + ) + elif config_data["neighbor"].get("encryption_password"): + command += " password {type} {password}".format( + **config_data["neighbor"]["encryption_password"] + ) + elif config_data["neighbor"].get("enforce_first_as"): + command += " enforce-first-as" + elif config_data["neighbor"].get("export_localpref"): + command += " export-localpref {export_localpref}".format( + **config_data["neighbor"] + ) + elif config_data["neighbor"].get("fall_over"): + command += " fall-over bfd" + elif config_data["neighbor"].get("graceful_restart"): + command += " graceful-restart" + elif config_data["neighbor"].get("graceful_restart_helper"): + command += " graceful-restart-helper" + elif config_data["neighbor"].get("idle_restart_timer"): + command += " idle-restart-timer {idle_restart_timer}".format( + **config_data["neighbor"] + ) + elif config_data["neighbor"].get("import_localpref"): + command += " import-localpref {import_localpref}".format( + **config_data["neighbor"] + ) + elif config_data["neighbor"].get("link_bandwidth"): + command += " link-bandwidth" + if config_data["neighbor"]["link_bandwidth"].get("auto"): + command += " auto" + if config_data["neighbor"]["link_bandwidth"].get("default"): + command += " default {default}".format( + **config_data["neighbor"]["link_bandwidth"] + ) + if config_data["neighbor"]["link_bandwidth"].get("update_delay"): + command += " update-delay {update_delay}".format( + **config_data["neighbor"]["link_bandwidth"] + ) + elif config_data["neighbor"].get("local_as"): + command += " local-as {as_number} no-prepend replace-as".format( + **config_data["neighbor"]["local_as"] + ) + if config_data["neighbor"]["local_as"].get("fallback"): + command += " fallback" + elif config_data["neighbor"].get("local_v6_addr"): + command += " local-v6-addr {local_v6_addr}".format( + **config_data["neighbor"] + ) + elif config_data["neighbor"].get("maximum_accepted_routes"): + command += " maximum-accepted-routes {count}".format( + **config_data["neighbor"]["maximum_accepted_routes"] + ) + if config_data["neighbor"]["maximum_accepted_routes"].get( + "warning_limit", + ): + command += " warning-limit {warning_limit}".format( + **config_data["neighbor"]["maximum_accepted_routes"] + ) + elif config_data["neighbor"].get("maximum_received_routes"): + command += " maximum-routes {count}".format( + **config_data["neighbor"]["maximum_received_routes"] + ) + if config_data["neighbor"]["maximum_received_routes"].get( + "warning_limit", + ): + if config_data["neighbor"]["maximum_received_routes"][ + "warning_limit" + ].get("limit_count"): + command += " warning-limit {limit_count}".format( + **config_data["neighbor"]["maximum_received_routes"][ + "warning_limit" + ] + ) + if config_data["neighbor"]["maximum_received_routes"][ + "warning_limit" + ].get("limit_percent"): + command += ( + " warning-limit " + + str( + config_data["neighbor"]["maximum_received_routes"][ + "warning_limit" + ]["limit_percent"], + ) + + " percent" + ) + if config_data["neighbor"]["maximum_received_routes"].get( + "warning_only", + ): + command += " warning-only" + elif config_data["neighbor"].get("metric_out"): + command += " metric-out {metric_out}".format(**config_data["neighbor"]) + elif config_data["neighbor"].get("monitoring"): + command += " monitoring" + elif config_data["neighbor"].get("next_hop_self"): + command += " next-hop-self" + elif config_data["neighbor"].get("next_hop_unchanged"): + command += " next-hop-unchanged" + elif config_data["neighbor"].get("next_hop_v6_address"): + command += " next-hop-v6-addr {next_hop_v6_address} in".format( + **config_data["neighbor"] + ) + elif config_data["neighbor"].get("out_delay"): + command += " out-delay {out_delay}".format(**config_data["neighbor"]) + elif config_data["neighbor"].get("remote_as"): + command += " remote-as {remote_as}".format(**config_data["neighbor"]) + elif config_data["neighbor"].get("remove_private_as"): + command += " remove-private-as" + if config_data["neighbor"]["remove_private_as"].get("all"): + command += " all" + if config_data["neighbor"]["remove_private_as"].get("replace_as"): + command += " replace-as" + elif config_data["neighbor"].get("peer_as"): + command += " peer-as {peer_as}".format(**config_data["neighbor"]) + elif config_data["neighbor"].get("prefix_list"): + command += " prefix-list {name} {direction}".format( + **config_data["neighbor"]["prefix_list"] + ) + elif config_data["neighbor"].get("route_map"): + command += " route-map {name} {direction}".format( + **config_data["neighbor"]["route_map"] + ) + elif config_data["neighbor"].get("route_reflector_client"): + command += " route-reflector-client" + elif config_data["neighbor"].get("route_to_peer"): + command += " route-to-peer" + elif config_data["neighbor"].get("send_community"): + command += " send-community" + if config_data["neighbor"]["send_community"].get( + "community_attribute", + ): + command += ( + " " + + config_data["neighbor"]["send_community"][ + "community_attribute" + ] + ) + if config_data["neighbor"]["send_community"].get("sub_attribute"): + command += ( + " " + + config_data["neighbor"]["send_community"]["sub_attribute"] + ) + if config_data["neighbor"]["send_community"].get( + "link_bandwidth_attribute", + ): + command += ( + " " + + config_data["neighbor"]["send_community"][ + "link_bandwidth_attribute" + ] + ) + if config_data["neighbor"]["send_community"].get("speed"): + command += " " + config_data["neighbor"]["send_community"]["speed"] + if config_data["neighbor"]["send_community"].get("divide"): + command += ( + " " + config_data["neighbor"]["send_community"]["divide"] + ) + elif config_data["neighbor"].get("shutdown"): + command += " shutdown" + elif config_data["neighbor"].get("soft_reconfiguration"): + command += " soft-reconfiguration inbound" + if config_data["neighbor"]["soft_reconfiguration"] == "all": + command += " all" + elif config_data["neighbor"].get("transport"): + command += " transport" + if config_data["neighbor"]["transport"].get("connection_mode"): + command += " connection-mode passive" + else: + command += " remote-port {remote_port}".format( + **config_data["neighbor"]["transport"] + ) + elif config_data["neighbor"].get("timers"): + command += " timers {keepalive} {holdtime}".format( + **config_data["neighbor"]["timers"] + ) + elif config_data["neighbor"].get("ttl"): + command += " ttl maximum-hops {ttl}".format(**config_data["neighbor"]) + elif config_data["neighbor"].get("update_source"): + command += " update-source {update_source}".format( + **config_data["neighbor"] + ) + elif config_data["neighbor"].get("weight"): + command += " weight {weight}".format(**config_data["neighbor"]) + return command + + +def _tmplt_bgp_network(config_data): + command = "network {address}".format(**config_data) + if config_data.get("route_map"): + command += " route-map {route_map}".format(**config_data) + return command + + +def _tmplt_bgp_route_target(config_data): + command = "route-target {action}".format(**config_data["route_target"]) + if config_data["route_target"].get("type"): + command += " {type}".format(**config_data["route_target"]) + if config_data["route_target"].get("route_map"): + command += " {route_map}".format(**config_data["route_target"]) + if config_data["route_target"].get("imported_route"): + command += " imported-route" + if config_data["route_target"].get("target"): + command += " {target}".format(**config_data["route_target"]) + + return command + + +def _tmplt_bgp_router_id(config_data): + command = "router-id {router_id}".format(**config_data) + return command + + +def _tmplt_bgp_shutdown(config_data): + return "shutdown" + + +def _tmplt_bgp_timers(config_data): + command = "timers bgp {keepalive} {holdtime}".format( + **config_data["timers"] + ) + return command + + +def _tmplt_bgp_ucmp(config_data): + command = "ucmp" + if "fec" in config_data["ucmp"]: + command += " fec threshold trigger" + command += " {trigger} clear {clear} warning-only".format( + **config_data["ucmp"]["fec"] + ) + if "link_bandwidth" in config_data["ucmp"]: + command += " link-bandwidth {mode}".format( + **config_data["ucmp"]["link_bandwidth"] + ) + if config_data["ucmp"]["link_bandwidth"].get("mode") == "update_delay": + command += " {update_delay}".format( + **config_data["ucmp"]["link_bandwidth"] + ) + if "mode" in config_data["ucmp"]: + command += " mode 1" + if config_data["ucmp"]["mode"].get("nexthops"): + command += " {nexthops}".format(**config_data["ucmp"]["mode"]) + return command + + +def _tmplt_bgp_update(config_data): + command = "update {wait_for}".format(**config_data["update"]) + if config_data["update"].get("batch_size"): + command += " {batch_size}".format(**config_data["update"]) + return command + + +def _tmplt_bgp_vlan(config_data): + command = "vlan {vlan}".format(**config_data) + return command + + +def _tmplt_bgp_vlan_aware_bundle(config_data): + command = "vlan-aware-bundle " + config_data["vlan_aware_bundle"] + return command + + +class Bgp_globalTemplate(NetworkTemplate): + def __init__(self, lines=None, module=None): + super(Bgp_globalTemplate, self).__init__( + lines=lines, + tmplt=self, + module=module, + ) + + # fmt: off + PARSERS = [ + { + "name": "router", + "getval": re.compile( + r""" + ^router\s + bgp + \s(?P\S+) + $""", + re.VERBOSE, + ), + "setval": _tmplt_router_bgp_cmd, + "compval": "as_number", + "result": {"as_number": "{{ as_num }}"}, + }, + { + "name": "vrf", + "getval": re.compile( + r""" + \s*vrf + \s(?P\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_vrf, + "compval": "vrfs.vrf", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "vrf": "{{ vrf }}", + }, + }, + }, + "shared": True, + }, + { + "name": "aggregate_address", + "getval": re.compile( + r""" + \s*aggregate-address + \s+(?P
\S+) + \s*(?Pas-set)* + \s*(?Psummary-only)* + \s*(?Pattribute-map\s\S+)* + \s*(?Pmatch-map\s\S+)* + \s*(?Padvertise-only)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_aggregate_address, + "compval": "aggregate_address", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "aggregate_address": [ + { + "address": "{{ address }}", + "advertise_only": "{{ True if advertise_only is defined }}", + "as_set": "{{ True if as_set is defined }}", + "summary_only": "{{ True if summary_only is defined }}", + "attribute_map": "{{ attribute_map.split(" ")[1] }}", + "match_map": "{{ match_map.split(" ")[1] }}", + }, + ], + }, + }, + }, + }, + { + "name": "bgp_params_additional_paths", + "getval": re.compile( + r""" + \s*bgp + \s+additional-paths + \s+(?P\S+) + \s*(any) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.additional_paths", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "additional_paths": "{{ action }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_advertise_inactive", + "getval": re.compile( + r""" + \s*bgp + \s+advertise-inactive + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.advertise_inactive", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "advertise_inactive": "{{ True }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_allowas_in", + "getval": re.compile( + r""" + \s*bgp + \s+allowas-in + \s*(?P\d+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.allowas_in", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "allowas_in": { + "set": "{{ True if count is undefined }}", + "count": "{{ count }}", + }, + }, + }, + }, + }, + }, + { + "name": "bgp_params_always_compare_med", + "getval": re.compile( + r""" + \s*bgp + \s+always-compare-med + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.always_compare_med", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "always_compare_med": "{{ True }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_asn", + "getval": re.compile( + r""" + \s*bgp + \s+asn + \s+notation + \s+(?Pasdot|asplain) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.asn", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "asn": "{{ notation }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_auto_local_addr", + "getval": re.compile( + r""" + \s*bgp + \s+auto-local-addr + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.auto_local_addr", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "auto_local_addr": "{{ True }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_bestpath_as_path", + "getval": re.compile( + r""" + \s*bgp + \s+bestpath + \s*(?Pas-path\s\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.bestpath.as_path", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "bestpath": { + "as_path": "{{ as_path.split(" ")[1] }}", + }, + }, + }, + }, + }, + }, + { + "name": "bgp_params_bestpath_ecmp_fast", + "getval": re.compile( + r""" + \s*bgp + \s+bestpath + \s+ecmp-fast + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.bestpath.ecmp_fast", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "bestpath": { + "ecmp_fast": "{{ True }}", + }, + }, + }, + }, + }, + }, + { + "name": "bgp_params_bestpath_med", + "getval": re.compile( + r""" + \s*bgp + \s+bestpath + \s+med + \s*(?Pconfed)* + \s*(?Pmissing-as-worst)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.bestpath.med", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "med": { + "confed": "{{ True if confed is defined }}", + "missing_as_worst": "{{ True if missing is defined }}", + }, + }, + }, + }, + }, + }, + { + "name": "bgp_params_bestpath_skip", + "getval": re.compile( + r""" + \s*bgp + \s+bestpath + \s+(?Pskip) + \s+next-hop + \s+igp-cost + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.bestpath.skip", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "bestpath": { + "skip": "{{ True }}", + }, + }, + }, + }, + }, + }, + { + "name": "bgp_params_tie_break", + "getval": re.compile( + r""" + \s*bgp + \s+tie-break + \s+(?P\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.bestpath.tie_break", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "tie_break": "{{ tie }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_client_to_client", + "getval": re.compile( + r""" + \s*bgp + \s+client-to-client + \s+reflection + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.client_to_client", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "client_to_client": "{{ True }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_cluster_id", + "getval": re.compile( + r""" + \s*bgp + \s+cluster-id + \s+(?P
\S+) + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.cluster_id", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "cluster_id": "{{ address }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_confederation", + "getval": re.compile( + r""" + \s*bgp + \s+confederation + \s*(?Pidentifier\s.+)* + \s*(?Ppeers\s.+)* + $""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.confederation", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "confederation": { + "identifier": "{{ identifier.split(" ")[1] }}", + "peers": "{{ peers.split(" ")[1] }}", + }, + }, + }, + }, + }, + }, + { + "name": "bgp_params_control_plane_filter", + "getval": re.compile( + r""" + \s*bgp + \s+control-plane-filter + \s+default-allow + *$""", + re.VERBOSE, + ), + "setval": _tmplt_bgp_params, + "compval": "bgp_params.control_plane_filter", + "result": { + "vrfs": { + '{{ "vrf_" + vrf|d() }}': { + "bgp_params": { + "control_plane_filter": "{{ True }}", + }, + }, + }, + }, + }, + { + "name": "bgp_params_convergence", + "getval": re.compile( + r""" + \s*bgp + \s+convergence + \s*(?Pslow-peer)* + \s+(?P